Hallo, Wie kann ich bei einem Atmega 16 die Uart über ein Interrupt abfragen? Insgesamt sollten 4 Bytes empfangen werden. Wie kann ich die letzten 3 Bytes abspeichern? Empfange die Bytes über ein RS485 to TTL wandler. Bin in C noch ein Grünschnabel mehr wie Led zum leuchten bringen geht leider noch nicht... danke im Voraus!!! Gruß Dani
Daniel Rüscher schrieb: > Hallo, > > Wie kann ich bei einem Atmega 16 die Uart über ein Interrupt abfragen? Ähm. Du 'fragst' sie gar nicht ab. Genau das ist ja der Sinn von Interrupts. Man könnte höchstens sagen: Die Uart meldet sich bei deinem Programm, wenn ein Zeichen empfangen wurde. > Insgesamt sollten 4 Bytes empfangen werden. > > Wie kann ich die letzten 3 Bytes abspeichern? Indem du Speicher bereitstellst, der die 4 (oder 3) Bytes aufnehmen kann, zum Beispiel ein Array und im Interrupt mitzählst, wieviele bereits empfangen wurden und je nachdem dann das jeweils nächste Byte in das Array stellst.
1 | volatile uint8_t receivedBytes[4]; |
2 | volatile uint8_t nrReceived; |
3 | |
4 | ISR( USART_RXC_vect |
5 | {
|
6 | uint8_t nextByte = UDR; |
7 | |
8 | if( nrReceived < 4 ) { |
9 | receivedBytes[ nrReceived ] = nextByte; |
10 | nrReceived++; |
11 | }
|
12 | }
|
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART > > Empfange die Bytes über ein RS485 to TTL wandler. > > Bin in C noch ein Grünschnabel mehr wie Led zum leuchten bringen geht > leider noch nicht... und wozu brauchst du dann einen Interrupt. Wenn das Programm sonst nichts zu tun hat, reicht es völlig aus, in der Hauptschleife jeweils nachzusehen, ob in der Zwischenzeit ein neues Byte an der UART eingetroffen ist.
1 | ...
|
2 | int main() |
3 | {
|
4 | |
5 | ...
|
6 | |
7 | while( 1 ) { |
8 | |
9 | if( UCSRA & (1<<RXC) ) { // Hurra! AUf der Uart ist 1 Byte angekommen |
10 | nextByte = UDR; // hole es ab und mach was damit. |
11 | |
12 | ....
|
13 | }
|
14 | |
15 | }
|
16 | }
|
Dein µC ist viele hundert mal schneller durch die Hauptschleife durch, als die Übertragung eines Zeichens dauert.
Karl Heinz schrieb: > und wozu brauchst du dann einen Interrupt. Wenn das Programm sonst > nichts zu tun hat, reicht es völlig aus, in der Hauptschleife jeweils > nachzusehen, ob in der Zwischenzeit ein neues Byte an der UART > eingetroffen ist. Danke für die Antwort! Der Controller muss die letzten 3 Bytes abspeichern diese auswerten und dann ein Pin auf high setzen. Sollte aber danach gleich wieder Daten empfangen. und dann das selbe wieder von Anfang an. Gruss Dani
Abend, Deine Bytes trudeln ja einzeln nach einander ein. Immer wenn ein Byte eingetroffen ist lässt Du Dich vom Interrupt benachrichtigen und sicherst es. Du kannst Dir auch einen Empfangspuffer bauen und den automatisch füllen lassen. Dazu haben andere schon schönen Code geschrieben, den Du Dir als Anfänger einmal ansehen kannst. Suche z.B. mal nach Peter Pfleurys Uart Lib.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.