Morgen,
ich hab mal wieder mein Pollin-Board rausgekramt um ein wenig zu
"spielen".
Dabei will ich mich mal bei IRMP + ENC28J60 versuchen.
Ich hab nun ein seltsames Verhalten, dass sich anscheinend der µC
dauernd resettet. Ich hab mal ein Beispielcode geschrieben, womit das
reproduzierbar ist. Das schnelle Blinken was am Anfang ist, macht er
dauernd und das langsame Blinken in der Schleife macht er garnicht, da
bleibt konstant die LED an. Achja es ist ein ATmega16 @ 16Mhz.
Wahrscheinlich seh ich wieder den Wald vor lauter Bäumen nicht.
Kommentier diese Zeilen mal aus:
irmp_init();
(void) irmp_ISR();
Wenn es dann geht, liegt der Fehler im Code dieser Library bzw.
irgendwelche Voraussetzungen sind nicht erfüllt, die sie zum
Funktionieren benötigt.
Vielleicht compiliert der Compiler für den falschen Controller, sodass
der Interruptvektor für COMPA am falschen Index steht?
Ist vielleicht der Watchdog eingeschaltet?
Mathias O. schrieb:> Wo kann man denn den Watchdog ausschalten?
Da, wo man ihn auch einschaltet...
Überprüf mal die Fuses..
in 99% aller Fääle kommt das gezeigte Verhalten durch einen Interrupt
ohne zugehörige ISR. Da es funktioniert, wenn du das sei
auskommentierst, such halt mal, welche Interrupts alle freigegeben sind.
Oliver
Hi
>Wo kann man denn den Watchdog ausschalten?
Hast du den denn eingeschaltet?
>Wenn ich>timer1_init();>und>sei();>auskommentiere, funktioniert es.
Dann hat es auch nichts mit dem WD zu tun.
MfG Spess
Mathias O. schrieb:> Also es ist -mmcu=atmega16, somit stimmt das.>> Wo kann man denn den Watchdog ausschalten?
Ein ähnliches Problem hatte mal einer mit ATmega16 und STK500.
Schau mal hier:
Beitrag "ATMega16: Interrupt mit Timer1"
Da war's jedenfalls der Watchdog, Lösung steht am Ende des (kurzen)
Threads auch dabei.
Was mich aber wundert: Sobald Du timer1_init() und sei() rausnimmst,
funktioniert es? Dann müsste es auch gehen, wenn Du nur sei()
rausnimmst. Kannst Du das mal testen?
Bekommst Du beim Übersetzen irgendwelche Compiler-Warnungen?
Der Code ist ja nicht vollständig, es fehlen ja noch die uart-Routinen.
Benutzen diese vielleicht Interrupts - eingeschaltet durch uart_init() -
mit falschem Interrupt-Vektor? Dann solltest Du aber eine Warnung vom
Compiler erhalten.
Also mit dem disablen des Watchdogs ist es auch nicht besser.
Die Uart-Routinen sind von Fleury. Die haben sich auch schon mehfach
bewährt.
Die Fuses sind 0xFE(low) 0xC9(high).
Warnungen bekomme ich keine.
Mathias O. schrieb:> Warum sollte auch die Lib ausgerechnet bei mir> nicht funktionieren. Bei Anderen läuft sie ja.
Na ja, das könnte man jetzt kommentieren...
Egal, häng halt mal eine kompletten kompilierbaren Code hier an.
Oliver
Oliver S. schrieb:> Mathias O. schrieb:>> Warum sollte auch die Lib ausgerechnet bei mir>> nicht funktionieren. Bei Anderen läuft sie ja.>> Na ja, das könnte man jetzt kommentieren...>> Egal, häng halt mal eine kompletten kompilierbaren Code hier an.>> Oliver
Wenn es einfach funktionieren soll, dann füg das in den Code ein:
ISR(BADISR_vect) { }
und es wird funktionieren.
Es wird irgendein Interrupt ausgelöst bei dem keine ISR definiert ist,
dann springt das Programm jedesmal an den Anfang wenn das entsprechende
Interrupt ausgelöst wird.
Das ist schon mal Käse. Damit kannst Du nicht gewährleisten, dass die
anderen Module (uart, irmp) mit der gleichen F_CPU compiliert werden.
Setz dies als Compiler-Option im Makefile oder Projekt für alle
C-Dateien.
1
>#include"irmpconfig.h"
2
>#include"irmp.h"
Du benutzt hier einen 2 Jahre alten IRMP. Hole Dir bitte die aktuelle
Version, siehe IRMP. Bei aktuellen Versionen darfst Du auch nur noch
irmp.h "includieren".
Woran erkennst Du eigentlich, dass der ATmega resettet wird? Fängt er
(wie am Anfang) an zu blinken?
Folgende Fragen hast Du vergessen, zu beantworten:
Reicht auch das Auskommentieren von sei() alleine, damit der ATmege
läuft?
Funktioniert das Programm mit
1
ISR(BADISR_vect)
2
{
3
}
auch bei eingeschaltetem sei()?
P.S.
Du schriebst, dass der Fehler auch ohne Aufruf von irmp_init() und
irmp_ISR() auftritt.
Dann hast Du aber nicht das minimalste Programm gepostet. Das wäre
nämlich ohne die beiden Aufrufe und ohne die irmp-Includes und ohne
irmp-Source-Dateien gewesen. Teste das bitte nochmal.
Funktioniert auch nicht.
Wenn ich sei(); auskommentiere funktioniert es.
Das resetten merke ich daran, dass er das schnelle Blinken vom Anfang
(PD5) macht.
Das
> Also mit dem disablen des Watchdogs ist es auch nicht besser.
Wie jetzt?
War der aktiviert oder nicht?
> Wenn ich sei(); auskommentiere funktioniert es.
Dann bleibt nicht mehr viel.
Normalerweise würde ich jetzt sagen: du compilierst für den falschen
Prozessor.
Karl Heinz schrieb:> Normalerweise würde ich jetzt sagen: du compilierst für den falschen> Prozessor.
Oder evtl. unterschiedliche µCs für Kompilieren und Linken angegeben?
Mathias O. schrieb:> Minimalistisch sieht es so aus.
Bin jetzt auch ratlos. Das Ding müsste auch mit sei() laufen.
Kannst Du mal die Kommandos kopieren und hier einfügen, die beim
Kompilieren bzw. Linken durchgeführt werden?
"Hängen bleiben" würde das wohl auch, wenn der Prozessor nicht mit
16Mhz, sondern nur mit 1MHz laufen würde. Die oben genannten Fuses sind
aber auch richtig.
Oliver
Na toll. Hab es jetzt geschafft. In Code::Blocks gibt man den mmcu in
den Buildoptions an. Ich hab ihn allgemein beim Projekt angegeben, dann
kann man ihn aber auch noch angeben bei debug und release. Ich hab ihn
jetzt mal release auch noch angegeben, sowie F_CPU.
Und siehe da es funktioniert.
Der Output sieht nun so aus.
Danke nochmal an alle für die Hilfe. Ich kam mir echt schon bescheuert
vor.
Wenn es ne Kaffekasse geben würde, würde ich da jetzt was reinschmeissen
;)
Da ist was doppelt gemoppelt.
> Wenn es ne Kaffekasse geben würde, würde ich da jetzt was reinschmeissen> ;)
Ich hol mir den Kaffee auch ohne Kasse.... nämlich jetzt! :-)
Guten Morge,
so langsam fühle ich mich echt verarscht. Ich wollte jetzt den UART
ansprechen und wollte die Lib von Fleury verwenden. Sobald ich wieder
sei(); drin habe, macht er nur das Blinken vom Anfang und geht nicht in
die Schleife rein.
Ich frage mich warum das so ein Krampf ist. Als ich das zuletzt vor
Monaten mit einem mega8 gemacht habe funktionierte alles.
Ich hab jetzt auch nochmal einen anderen mega16 genommen, aber der zeigt
das selbe Verhalten.
Ich bin echt ratlos.
Ich hab das normale Pollin-Board. 4,82V mess ich am mega.
Auch mit 16000000UL direkt klappt es nicht. Wenn F_CPU nicht stimmen
würde, würde es doch auch nicht im richtigen Takt blinken oder?
Mathias O. schrieb:> würde es doch auch nicht im richtigen Takt blinken oder?
Auch richtig. Kannst Du den Code simulieren und die Register
untersuchen? So wie jetzt stocherst Du im Nebel.
In der uart.c der Fleury Lib sind conditional defines drin, um auf die
verschiedenen µCs anzupassen. Wenn da das Symbol des Prozessors (s.o.)
nicht klar ist, könnt's zu Problemen kommen.
Da sollten aber Meldungen vom Compiler kommen, was steht in der Ausgabe?
lmao schrieb:> Mathias O. schrieb:>> Guten Morge,>>>> so langsam fühle ich mich echt verarscht.>> Das Problem sitzt meist vorm Rechner
Soweit bin ich auch schon gekommen.
Ausgabe sieht so aus:
1
-------------- Build: Release in IRMP (compiler: GNU AVR GCC Compiler)---------------
Mathias O. schrieb:> avr-gcc.exe -mmcu=atmega16 -Os -DF_CPU=16000000UL -c main.c -o> obj\Release\main.o> avr-gcc.exe -mmcu=atmega16 -Os -DF_CPU=16000000UL -c uart.c -o> obj\Release\uart.o> avr-g++.exe -LD:\opencv\build\x86\mingw\lib -o bin\Release\IRMP.elf> obj\Release\main.o obj\Release\uart.o> -Wl,-Map=bin\Release\IRMP.map,--cref
Für einen avr ist der Lib-Pfad völlig unsinnig, dafür fehlen da ein paar
der sonst üblichen Optionen. Bist du sicher, daß deine IDE auch
tatasächlich AVR-Programme erezugen kann, und dafür richtig eingestellt
ist?
Lass dir mal mit MFile ein makefile erezugen, und compiler damit. Oder
pack deine Sourcen ins AVR-Studio, und lass das mal kompilieren.
Oliver
srec_cat: bin\Release\IRMP.fuse: 1: file contains no data
16
Process terminated with status 1 (0 minutes, 0 seconds)
17
0 errors, 0 warnings (0 minutes, 0 seconds)
Wenn er keine AVR-Programme erzeugen würde, warum blinkt dann die Led
wie im Programm vorgegeben?
Irgendwas scheint mit dem Interrupt im UART nicht zu funktionieren.
Wenn ich statt
Mathias O. schrieb:> UART0_CONTROL |= _BV(UART0_UDRIE);
Das sieht so aus, als ob der Interrupt zu UART0_UDRIE nicht passt. Der
müsste eigentlich so aussehen:
ISR(USART_UDRE_vect)
{
....
}
Aber: Wenn er denn wirklich falsch wäre, dann müsste der Compiler auch
eine Warnung ausgeben, dass der Interrupt-Handler-Name falsch wäre (so
ähnlich jedenfalls). Ausserdem glaube ich nicht, dass ein derartiger
Schnitzer im Fleury-Source ist.
Sehr merkwürdig das ganze.
MWS schrieb:> Wenn Du das Hex-File postest, schau' ich mal rein, was los ist.
Die ersten paar Zeilen aus der lss-Datei (Interrupt-Vektor-Tabelle)
wären lesbarer und deshalb interessanter ;-)
Frank M. schrieb:> Die ersten paar Zeilen aus der lss-Datei (Interrupt-Vektor-Tabelle)> wären lesbarer und deshalb interessanter ;-)
Die Tabelle seh' ich auch so und die ist Murks, da stehen an den
Vektoren RJMPs statt JMPs drin, der letzte Teil der IVT ist Müll. Der
Stackpointer wird auf 0x025F initialisiert, müsste beim ATM16 auf 0x045F
sein. Da stimmt das Target nicht.
einmal avr-gcc und dann avr-g++ ?
Auch fehlt mir in der Linker Anweisung die Angabe vom Mega16
Poste doch mal dein makefile. Da scheint ein ordentlicher Wurm drinnen
zu sein.
Mathias O. schrieb:> avr-g++.exe -o bin\Release\IRMP.elf obj\Release\main.o> obj\Release\uart.o -Wl,-Map=bin\Release\IRMP.map,--cref
Bei mir steht da immer noch mindestens ein "-mmcu=xxxxxx".
Außerdem wundere ich mich, warum zum Linken avr-g++ statt avr-gcc
aufgerufen wird.
Edit: Karl Heinz war schneller :-)
Super endlich. Hab in den Linker settings noch -mmcu=atmega16 angegeben
und nun funktioniert es endlich richtig alles.
Ihr seid einfach klasse und sooooo geduldig.
Mathias O. schrieb:> Ich arbeite mit Code::Blocks.
Das hab' ich gelesen, kenn' mich mit Codeblocks aber nicht aus.
Vielleicht compilierst Du auch etwas anderes, als dass Du auf den µC
brennst, vergleich' dich mal die Erstellungs-/Änderungszeiten der
beteiligten Dateien. Im Hex-Code werden Befehle ausgeführt, die nicht im
C-Code wie oben zu finden sind:
Mathias O. schrieb:> Super endlich. Hab in den Linker settings noch -mmcu=atmega16 angegeben> und nun funktioniert es endlich richtig alles.
Das hättest du schon gestern haben können. :-)
Konrad S. schrieb im Beitrag #3601753:
> Oder evtl. unterschiedliche µCs für Kompilieren und Linken angegeben?
Konrad S. schrieb im Beitrag #3602476:
> Es wäre noch interessant zu wissen, wie die Aufrufe vorher aussahen,> einmal beim Kompilieren von main.c und einmal beim Linken des Programms.
@MWS: Ich hatte zwischeinzeitlich nochwas geändert/hinzugefügt. Wollte
das er erst was sendet per UART wenn ich einen Taster drücke.
@Konrad: Ja ja. Im nachinein ist man immer schlauer ;). Aber ich
verspreche Besserung.