Forum: Mikrocontroller und Digitale Elektronik uart über interrupt abfragen


von Daniel B. (yzdani)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Daniel B. (yzdani)


Lesenswert?

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

von Toralf W. (willi)


Lesenswert?

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
Noch kein Account? Hier anmelden.