www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem: Atmega 32 Rx Interupt Zählvariable


Autor: Sebastian Z. (sz1985)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe aktuell ein Problem mit meinem Atmega32. Ich möchte Daten der 
USART über den Interrupt einlesen. Sobald Daten gesendet werden, soll 
der Interrupt geöffnet werden, die Daten in ein array gespeichert, und 
eine Zählvariable erhöht werden. Diese Zählvariable möchte ich später 
auch im Hauptprogramm verwenden.
Leider scheiter ich gerade daran, dass die Zählvariable im Interrupt 
richtig erhöht wird, aber im Hauptprogramm immer noch den Startwert 
besitzt.

Hoffe es kann mir einer von euch sagen, wo mein Fehler liegt.

Code:

#include <stdio.h>
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>

unsigned int baud = 103;
unsigned char data[32];
unsigned char rcv_length=0;

ISR(USART_RXC_vect)
{

data[rcv_length] = UDR;

//UDR = data[rcv_length];
rcv_length++;
};

void USART_Init(unsigned char baud)
{
UBRRH = (unsigned char) (baud>>8);
UBRRL = (unsigned char) baud;
UCSRC = (1<<URSEL) | (0<<USBS) | (3<<UCSZ0) |(2<<UPM0);
UCSRB = (1<<TXEN) | (1<<RXEN) | (1<<RXCIE);
};

void USART_Transmit(unsigned char data)
{
while( !(UCSRA & (1<<UDRE) ) );
UDR = data;
};

//Hauptprogramm
int main(void)
{
USART_Init(baud);
sei();

while(1)
{
_delay_ms(1000);
USART_Transmit(rcv_length);
};
}


Vielen Dank im Vorraus!


Gruss

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian Z. schrieb:

> Leider scheiter ich gerade daran, dass die Zählvariable im Interrupt
> richtig erhöht wird, aber im Hauptprogramm immer noch den Startwert
> besitzt.

volatile unsigned char rcv_length=0;

Autor: Sebastian Z. (sz1985)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Karl Heinz!

Wenn ich jetzt "data[rcv_legth]" über die Funktion USART-Transmit senden 
möchte?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian Z. schrieb:
> Vielen Dank Karl Heinz!
>
> Wenn ich jetzt "data[rcv_legth]" über die Funktion USART-Transmit senden
> möchte?

Dann schickst du es. Wo ist das Problem?
(Ausser das in data[rcv_length] noch nichts sinnvolles stehen wird, weil 
es noch nie beschrieben wurde)

Wenn du alles bisher empfange wieder zurückschicken willst, dann wäre zb 
eine Schleife das Mittel der Wahl.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.