Nemesis
05.10.2007, 17:18
Hi,
ich habe ein echtes Problem mit dem UART. Ich möchte Daten zwischen meinem PC und dem Atmega 32 austauschen.
Da ich nicht möchte das der Atmega 32 in der schleife fest steckt bis er etwas über die Comport Leitung vom PC empfängt. Dachte ich mir das ich das mit einem Interrupt versuche.
Ich kann den Interrupt jedoch nicht aktivieren/einstellen.
Hab schon alles mögliche versucht aber nix ging.
Hab dann auch etwas auf der roboternetz Seite gefunden das einem zeigt wie genau mann vor zu gehen hat. Um mit dem UART-Interrupt arbeiten zu können.
Das soll dann so fuktionieren:
1) Konfiguriere Interrupt
2) generell Interrupts zulassen
3) schalte speziell den InterruptXXX ein
4) verzweige bei InterruptXXX zu SprungXXX
Das ganze ist hier zu finden:
https://www.roboternetz.de/wissen/index.php/Bascom_Interrupts
Mit den Punkten 1 und 3 komme ich nicht zurecht hab keine ahnung wie mann das macht.
Mein Programm sieht etwa so aus:
#include <avr/io.h>
#include <avr/interrupt.h>
#define USART_RXC_vect _VECTOR(14)
#include <avr/delay.h>
/* USART-Init beim ATmega16 */
#ifndef F_CPU
#define F_CPU 16000000 /* Oszillator-Frequenz in Hz */
#endif
// Hilfsmakro zur UBRR-Berechnung ("Formel" laut Datenblatt)
#define UART_UBRR_CALC(BAUD_,FREQ_) ((16000000)/((19200)*16L)-1)
#define UART_BAUD_RATE 19200
char c = 97;
int main(void)
{
///////////////////////////////////////////interrupt für uart einstellen
/*1*/
/*2*/sei();
/*3*/
/*4*///steht oben
////////////////////////////////////////////
///////////////////////////////////////////UART einstellungen
UCSRB |= (1<<TXEN); // UART TX einschalten
UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1
UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );
UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );
//////////////////////////////////////////////////
while(c != 300)
{
UCSRB |= (1<<TXEN); // UART TX einschalten
UDR = c;
_delay_ms(200);
}
}
ISR(USART_RXC_vect) /* veraltet: SIGNAL(SIG_UART_RECV) */
{
while (!(UCSRA & (1<<RXC))) // warten bis Zeichen verfuegbar
c = UDR;
}
Zum Code(so soll es sein):
Ich schicke zu beginn ein kleines a vom controller zum PC (welches ich auch ohne Probleme am PC empfangen kann), danach sende ich ein irgent ein zeichen z.b. ein x vom PC zum Controller. Dieses Zeichen soll der Controller dann mit hilfe des Interrupts aufnehmen(damit er nicht in der Schleife für das Daten Empfangen fest hängt) und dann wieder zum PC zurück schicken.
Das einziegste was der Controller macht, ist mir immer nur das a zu schicken.
Ich hoffe es kann mir jemand dabei helf damit es richtig funktioniert.
Gruß Nemesis
ich habe ein echtes Problem mit dem UART. Ich möchte Daten zwischen meinem PC und dem Atmega 32 austauschen.
Da ich nicht möchte das der Atmega 32 in der schleife fest steckt bis er etwas über die Comport Leitung vom PC empfängt. Dachte ich mir das ich das mit einem Interrupt versuche.
Ich kann den Interrupt jedoch nicht aktivieren/einstellen.
Hab schon alles mögliche versucht aber nix ging.
Hab dann auch etwas auf der roboternetz Seite gefunden das einem zeigt wie genau mann vor zu gehen hat. Um mit dem UART-Interrupt arbeiten zu können.
Das soll dann so fuktionieren:
1) Konfiguriere Interrupt
2) generell Interrupts zulassen
3) schalte speziell den InterruptXXX ein
4) verzweige bei InterruptXXX zu SprungXXX
Das ganze ist hier zu finden:
https://www.roboternetz.de/wissen/index.php/Bascom_Interrupts
Mit den Punkten 1 und 3 komme ich nicht zurecht hab keine ahnung wie mann das macht.
Mein Programm sieht etwa so aus:
#include <avr/io.h>
#include <avr/interrupt.h>
#define USART_RXC_vect _VECTOR(14)
#include <avr/delay.h>
/* USART-Init beim ATmega16 */
#ifndef F_CPU
#define F_CPU 16000000 /* Oszillator-Frequenz in Hz */
#endif
// Hilfsmakro zur UBRR-Berechnung ("Formel" laut Datenblatt)
#define UART_UBRR_CALC(BAUD_,FREQ_) ((16000000)/((19200)*16L)-1)
#define UART_BAUD_RATE 19200
char c = 97;
int main(void)
{
///////////////////////////////////////////interrupt für uart einstellen
/*1*/
/*2*/sei();
/*3*/
/*4*///steht oben
////////////////////////////////////////////
///////////////////////////////////////////UART einstellungen
UCSRB |= (1<<TXEN); // UART TX einschalten
UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1
UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );
UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );
//////////////////////////////////////////////////
while(c != 300)
{
UCSRB |= (1<<TXEN); // UART TX einschalten
UDR = c;
_delay_ms(200);
}
}
ISR(USART_RXC_vect) /* veraltet: SIGNAL(SIG_UART_RECV) */
{
while (!(UCSRA & (1<<RXC))) // warten bis Zeichen verfuegbar
c = UDR;
}
Zum Code(so soll es sein):
Ich schicke zu beginn ein kleines a vom controller zum PC (welches ich auch ohne Probleme am PC empfangen kann), danach sende ich ein irgent ein zeichen z.b. ein x vom PC zum Controller. Dieses Zeichen soll der Controller dann mit hilfe des Interrupts aufnehmen(damit er nicht in der Schleife für das Daten Empfangen fest hängt) und dann wieder zum PC zurück schicken.
Das einziegste was der Controller macht, ist mir immer nur das a zu schicken.
Ich hoffe es kann mir jemand dabei helf damit es richtig funktioniert.
Gruß Nemesis