Womit programmierst du?
Bei avrgcc:
#include <avr/signal.h>
#include <avr/interrupt.h>
SIGNAL (SIG_UART_RECV) {
//do something
}
Hallo Leute,
bei meinem UART klappt das Senden zum PC ohne Probleme, alles wird richtig übertagen.
Wenn ich allerdings irgendetwas vom PC sende hängt sich der Controller (AtMega16) auf und führt keine Befehle mehr aus...
Mein kompletter UART-Code:
Code:void uart_init() { outp( (CPU_Frequency / (UART_BAUD_RATE*16L))-1 , UBRRL ); outp( 0, UBRRH ); outp( (1 << URSEL) | (3 << UCSZ0), UCSRC); outp( (1 << RXCIE) | (1 << TXEN) | (1 << RXEN), UCSRB); sei(); } void uart_nachricht(char* senden) { for (; *senden != '\0'; senden++) { loop_until_bit_is_set(UCSRA, UDRE); UDR=*senden; } loop_until_bit_is_set(UCSRA, UDRE); UDR = 13; } Signal (USART_Receive_Complete) { uart_nachricht("Hab was emfangen!"); }
Womit programmierst du?
Bei avrgcc:
#include <avr/signal.h>
#include <avr/interrupt.h>
SIGNAL (SIG_UART_RECV) {
//do something
}
Hi,
du muss in der Interruptroutine UDR auch auslesen. Ansonsten wird das Flag nicht gelöscht und die Routine ständig wieder ausgeführt. Und das zurücksenden solltest du nicht in der Interruptoutine machen, setz da lieber eine Variable und frag die im Hauptprogramm ab.
Ansonsten gilt das was der Gast schon geschrieben hat. Deine Syntax ist da einfach falsch...
MfG Kjion
danke für den Code jetzt gehts...
Meinen Code hatte ich aus einem alten AVR-GCC Tutorial, welches aber das einzigste ist was ich in der Richtung kenne.
Gibt es halbwegs neue, die auch AD-Wandler etc behandeln?
www.mc-project.de
Da werden sie geholfen
die Site gefällt mir ganz gut, danke
Ich hoffe die Beispiele dort lassen sich problemlos auf einen 16er übertragen
Wenn du mit 16er den ATmega16 meinst dann gehts ganz sicher. Musst nur schauen ob es irgendwo Mhz abhängige Funktionsbeispiele gibt, die du dann halt auf dein Quarz umschreiben musst.
Gruß Muraad
Lesezeichen