Goede avond,
ik wil met een avr (2313) in C serieel een byte versturen via 1 port, bv PORTA = 0x01.
Hoe kan ik een byte(letter, cijfer) uitlezen en serieel versturen?
Ik dacht misschien via een array en een for loop maar eigenlijk weet ik het niet.
Bvd,
Mark
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
bedankt, ik bedoel eigenlijk via de usart ja, ik heb echter geen ervaring met uC programmeren, wel in C.
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Dan moet je de I/O pin niet rechtstreeks aansturen.
Hoe wel?
Gebruik een kristal als klok, enkel dan bekom je een stabiele baudrate. Een externe kristaloscillator kan natuurlijk ook.
Stel de uart in op de gewenste baudrate.
Smijt alle te verzenden bytes in UDR.
Een simpel voorbeeld voor een 8MHz-kristal, dat constant een 'U' verzendt aan 9600Bd:
#define F_CPU 8000000UL
#define BAUD 9600UL
#include <avr/io.h>
void uart_init(void)
{
UCSRB = _BV(TXEN) | _BV(RXEN); // enable tx/rx
UCSRC = _BV(UCSZ1) | _BV(UCSZ0); // Set frame format: 8data, 1stop bit
UBRRH = 0; // set baudrate
UBRRL = (F_CPU / (16 * BAUD)) - 1;
}
// Wait until tx holding register is empty, then send character c down the UART Tx.
void uart_sendchar(unsigned char c)
{
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
}
int main(void)
{
uart_init();
while (1) {
uart_sendchar('U');
}
}
Aanvulling: als die data naar een PC moet, heb je uiteraard een TTL <-> RS232 omzetter nodig; een MAX232 bv.
Bedankt dat is een stuk simpeler zo!
Als ik het zo zie, volgens mij gebruik ik dan PD0 en PD1 voor RX en TX.
Aantal vraagjes:
Welke regel wordt de stopbit verstuurd?
Kan ik van die 'unsigned char c' ook een string maken?
Heb je ervaring in het simuleren in avrstudio 4.x?
Bvd,
Mark
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Oh! je hebt een AT90S2313. Ik ging er van uit dat je een ATtiny2313 had. Nou ja, de verschillen zijn gering, als ik me niet vergis.
Je gebruikt in dat geval idd. PD0 en PD1 voor RX en TX.
Het stopbit wordt automagisch verstuurd.
Een string verzenden kan zo:
void uart_sendstr(char *s)
{
while (*s) {
uart_sendchar(*s);
s++;
}
}
Aanroepen met "uart_sendstr("Tralala");" of "uart_sendstr(string);"
En nee, met avrstudio heb ik geen ervaring. Maar er lopen meerdere gebruikers rond op dit forum.
Nou ik heb ze allebei, maar ze zijn pin compatibale dacht ik.
Ik heb nog een vraag, als ik nu mijn ISP header op PB5 + PB6
aansluit, kan ik die pinnen nog gewoon gebruiken als in/uitgang?
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Dat hangt van de programmer af. Als dat een gebufferde programmer is, geeft die de pinnen volledig vrij, en kan je de pinnen onbeperkt als uitgang gebruiken. Bij een programmer waar de "buffer" uit weerstanden bestaat, kunnen die beperkend werken.
In beide gevallen kan je de pinnen niet gebruiken om een harde spanningsbron (een TTL-uitgang bv.) uit te lezen, die zal immers het programmeren beletten. In zo'n geval kan je best een weerstand tussen spanningsbron en pin plaatsen.
Hou er in elk geval rekening mee, dat al hetgeen je met die pinnen stuurt ook door de programmer --tijdens het programmeren-- zal gestuurd worden.
Ok bedankt.
Het is misschien stom maar ik begrijp ff 1 ding niet;
als je de AVR gaat flashen en er staat er gewoon netjes 5V op dan gaat het programma wat er in staat toch al werken?
Of komt er iets van een interrupt via de reset pin zodat de uC weet dat hij geflashed gaat worden?
Bedankt voor je hulp zo ver!
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Het eerste dat de programmer doet, is de RESET-pin laag maken. Daarna volgt een nauwgezet protocol waarbij SCK, MISO en MOSI betrokken zijn. Nauwgezet, om uit te sluiten dat een toevallige reeks bits op SCK en MOSI door de AVR per abuis als programmeer-opdracht zouden beschouwd worden.
Als je daar meer wil over weten, duik dan eens in een AVR-datasheet - bij die v/d ATtiny2313 moet je op pag. 176 zijn. Het is eenvoudiger dan het op het eerste zicht lijkt.
Ik heb het gelezen dank je, dus ik kan volgens mij die pinnen gewoon voorzien van een toggle schakelaar aangezien er dan verder niets uit poorten wordt gestuurd?