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.