Hallo an alle,
Irgendwie verzweifel ich grad. Ich versuche für meinen ATMega2560 mit
dem Entwicklungboard Arduino MEGAAdk mein USART1 mit einem Receive
Interrupt zu konfigurieren.
Analog beim ATmega 8 klappt es...
Wäre schön, wenn ihr mir helfen könnten.
Hier mein Code:
1
#include"usart.h"
2
3
4
//The setup function is called once at startup of the sketch
5
voidsetup()
6
{
7
USART_init_();
8
// SetINT_init();
9
// sei();
10
11
}
12
13
// The loop function is called in an endless loop
14
voidloop()
15
{
16
17
}
18
19
ISR(USART1_RX_vect)// USART1_RX_vect ?? funzt noch nicht!!!
simon schrieb:> Irgendwie verzweifel ich grad. Ich versuche für meinen ATMega2560 mit> dem Entwicklungboard Arduino MEGAAdk mein USART1 mit einem Receive> Interrupt zu konfigurieren.
Hast du es denn ohne Interrupt schon mal probiert.
Und da am besten mal einfach nur Senden lassen, damit du am PC siehst ob
und wenn ja was am PC ankommt (sprich ob die ganze Taktung inkl Baudrate
stimmt)
> Analog beim ATmega 8 klappt es...
Gewöhn dich an die Vorstellung, dass man Code nicht einfach von einem µC
auf einen anderen übernehmen kann. Man kann die Grundidee und Codeteile
übernehmen, aber dann behandelt man den Code so, wie wenn man ihn neu
schreiben müsste. D.h. ALLES wird mit dem Datenblatt kontrolliert.
Insofern ist es irrelevant, ob das mit dem Mega8 funktioniert hat oder
nicht. Das ist ein neues Programm und das soll auf einem 2560 laufen.
Und nur das zählt.
> void setup()> {> USART_init_();> // SetINT_init();> // sei();>> }
OHne freigegbenen Interrupts wirds aber nichts mit dem Receive Interrupt
> void USART_init_(void) {> UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1) | (1 << TXCIE1);> //Enable Receiver and Transmitter 1, RX Complete Interrupt Enable 1, TX> Complete Interrupt Enable 1> UCSR2B = (1 << RXEN2) | (1 << TXEN2) | (1 << RXCIE2) | (1 << TXCIE2);> //Enable Receiver and Transmitter 2, RX Complete Interrupt Enable 2, TX> Complete Interrupt Enable 2> UCSR3B = (1 << RXEN3) | (1 << TXEN3) | (1 << RXCIE3) | (1 << TXCIE3);> //Enable Receiver and Transmitter 3, RX Complete Interrupt Enable 3, TX> Complete Interrupt Enable 3
Es ist keine so gute Idee, alle Interrupts auf Verdacht freizugeben. Vor
allen Dingen dann nicht, wenn man keine ISR dazu hat. Denn wenn der
Interrupt auftritt, und es keine ISR dafür gibt, dann wird das mit einem
Prozessor-Reset quittiert. Insofern hast du zwar den Transmit Complete
Interrupt freigegeben, aber keine ISR dafür. Ergo ....
Hallo Karl Heinz Buchegger,
Vielen Dank für deine Antwort.
Das Senden vom Mikrocontroller aus funktioniert einwandfrei. ich habe
dazu einfach in die loop() die Funktion Sende_Char('h'); geschrieben.
Meine Korrekturen:
USART_RX_vect heissen!
Du hast mehere UARTS und jede hat ihren eigenen Interrupt Vektor. Die
Erwartung ist also, dass die Nummer der UART für die diese ISR zuständig
ist, sich im Namen der ISR niederschlägt.
Du hast ja hier
1
UCSR1B=(1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);
auch überall die '1' für die UART mit der Nummer 1 drinnen.
Hast du keine Compiler Warnung bekommen?
Nein, habe ich nicht, da es USART0 glaube ich nicht gibt da ist USART.
das habe ich behoben, dennoch keine Änderung... :(
Ich bin dir schon jetzt sehr dankbar für deine Hilfe.
... :-(
simon schrieb:> das habe ich behoben, dennoch keine Änderung... :(
Was hast du behoben?
Hast du auch die Interrupts mittels sei() freigegeben?
Tu dir selbst einen Gefallen und zeig IMMER deinen kompletten Code. Häng
das File einfach als Attachment an, das ist schon ok.
Aber dadurch, dass du uns auf dieser Seite des Monitors Rätselraten
lässt, was und wie du deinen Code verändert hast, wird die Sache nicht
besser.
sei() ist auskommentiert und kommt in setInt() nochmal vor, welche aber
nicht aufgerufen wird. Was machst du da eigentlich fürn crap?
Was hat die "usart.c" mit deinen Interrupts und vorallem dem I-Bit zu
tun? Das gehört da nicht rein. Kapsle deinen Code ordentlich. Jedes
Modul hat ne bestimmte Aufgabe. Die Aufgabe der uart.c ist bestimmt
NICHT die Interrupts global zu schalten.
Wäre so es so schwer in die main vor der Hauptschleife ein sei() zu
machen? In deiner Arduino/Sketch Deppenumgebung wäre das dann wohl die
setup(). Das sei() dort wieder entkommentieren.
Hallo, danke für eure Tipps.
Ich denke ich ahbe sie alle mit eingebunden. Im Anhang findet ihr
meinen Code.
Und hier die das Main-Programm
// Do not remove the include below
#include "rs232.h"
#include "usart.h"
1
ISR(USART0_RX_vect)// USART1_RX_vect ?? funzt noch nicht!!!
2
{
3
UDR0='x';
4
}
5
6
//The setup function is called once at startup of the sketch
7
voidsetup()
8
{
9
USART_init_();
10
sei();
11
12
13
}
14
15
// The loop function is called in an endless loop
16
voidloop()
17
{
18
19
}
AAUSGABE: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Nur zur Erklärung:
ich möchte mit einem Terminal-Programm ein Zeichen senden. dann soll die
ISR() sich melden und ggf etwas senden.
Ich bin euch für die Hilfe sehr dankbar!
Viele Grüße,
simon schrieb:> Hat denn niemand noch eine Idee??
Zu was denn genau? Den ganzen x-en etwa?
Das liegt daran, dass du in der RX-ISR das Datenregister nicht ausließt.
simon schrieb:> Hat denn niemand noch eine Idee??>> bitte...
Ja.
Lernen
AVR-TutorialAVR-GCC-Tutorial
Was ist denn momantan hier im Forum los?
Einer nach dem anderen schlägt mit 0 Wissen auf und erwartet, dass wir
ihm seine Probleme lösen, weil er/sie nicht in die Tutorien und/oder
Datenblatt sehen will um mal ein wenig nachzulesen.
Karl Heinz Buchegger schrieb:> Was ist denn momantan hier im Forum los?> Einer nach dem anderen schlägt mit 0 Wissen auf und erwartet, dass wir> ihm seine Probleme lösen, weil er/sie nicht in die Tutorien und/oder> Datenblatt sehen will um mal ein wenig nachzulesen.
Das Bachelor-System macht sich langsam bemerkbar. Und/Oder G8 ;-)
gruß cyblord