Wenn ich ein neues Projekt erstelle und dort sei(); mache vor der while(1) in der Main. Dann wird das rot. Kompilieren kann ich es nicht. Klar.
#include <avr/interrupt.h>
eingefügt schon geht das kompilieren. Aber das bleibt dennoch rot "undefined reference" wenn man mit der Maus drüber geht.
Mache ich eine ISR ist das Wort ISR nicht lila sondern orange wie bei einer Funktion.
Ich nutze Tiny1614 und mache dort eine einfaches Programm:
Einen Pin auf Eingang und BOTHEDGES ISR
Einen Pin auf Ausgang
In der ISR toggle ich jetzt den Ausgangspin. Am Eingang liegt ein Rechteck an
Entsprechend sollte ich auf dem Ausgang auch ein Rechteck haben.
Passieren tu nichts. Als wären gar keine ISR aktiv oder vorhanden.
Dann mal mit einem Timer gemacht und nur den Ausgangspin getoggelt.
Gleiches ergebnis. Es scheint so, als wäre da was nicht OK seitens des AS.
Am Code liegt das definitiv nicht.
Könnte das Problem sein. Hast du mal geschaut, ob der von deiner
Studio-Version unterstützt wird?
Oliver
Ich nutze den in ca. 60 Projekten. Die ganzen Projekte wo der drin ist, da funktioniert es. Kopiere ich dieses Projekt geht das kopierte nicht mehr....
Strange oder?
Ich habe die neuste Version Microchip Studio. Wenn ich ein neues Projekt anlege wird mir der Tiny1614 ja auch aufgeführt. Ich habe es vorhin deinstalliert und neuinstalliert sowie PC neustart. Das ist es auch nicht.
Es liegt auch nicht am verwendeten CPU Typ. Ich hatte gerade mal mit anderen getestet (Tiny85, Mega328P, Xmega) es ist überall das gleiche. sei bleibt rot unterstrichen und ISR wird orange wie eine Funktion. Obowhl die avr/interrupt.h eingebunden ist.
Zeige mal die Meldungen - in "meinem Microchip-Studio" geht es ohne
Probleme.
Exakt wie bei dir. Das kompilieren geht ja auch.
Aber auch wie bei dir, das ISR ist orange und das sei(); rot unterstrichen - ohne Referenz. Kompilieren geht. Spiele ich es auf den Chip, geht es nicht.
Ich muss aber eine Korrektur machen:
Seit der Deinstallation, PC Neustart, Neuinstallation, PC Neustart geht es wieder alles. Crazy.
Scheinbar braucht die "Intellisense-Unterstützung" noch etwas "Reife"
... :-)
Irgendwie geht das gar nicht.
Jetzt ging es. Anderes Tiny1614 Projekt kompiliert.
Dann wieder zu dem Projekt. Jetzt geht das wieder nicht mehr.
Code läuft erfolgreich durch, auf den Chip gespielt keine IRQ funktionieren.
Ich deinstalliere das später noch einmal und erneut installieren wenn das dann wieder geht, mache ich die Software fertig und gehe nie wieder an das Projekt.
Ich kapier das hier nicht
Das stimmt nicht.
OUT ist korrekt.
Es gibt auch OUTTGL, aber das muss man nicht nehmen, Xor geht es genauso. Was würde man nur sonst bei den Megas machen die das nicht so schön in STrukturen haben wie die neuen Tiny, Mega und XMEGA :)
Das ist zwar so, ändert aber nichts am zweiten Einwand - wo steht das Setzen auf OUTPUT für PORTA.Pin3?:
'OUT ... This configuration only has an effect when the output driver (PORTx.DIR) is enabled for the corresponding pin.'
Das ist zwar so, ändert aber nichts am zweiten Einwand - wo steht das
Setzen auf OUTPUT für PORTA.Pin3?:
'OUT ... This configuration only has an effect when the output driver
(PORTx.DIR) is enabled for the corresponding pin.'
Es steht oben ganz oben drin.
PORTB.DIR = xyz
Wie gesagt, die Software ist FEHLERFREI.
Es geht NICHT. Auch nach neuinstallation, PC neustart usw.
Das Programm von oben läuft nicht auf dem Chip ich kapiere nicht was das Problem ist.
Starke Worte. Du scheinst nicht viel Erfahrung im Bereich Software zu
haben.
Ja dann sag mir bitte wo der Fehler liegt. Du weißt ja scheinbar bescheid.
Spiele ich die Software wie unten angegeben auf, habe ich an PA2 das toggeln in hoher Frequenz. Die ISR macht nichts.
Gestern lief genau das gleiche Programm auch mit der ISR. Dann wieder nicht mehr. Den gleichen Code vom Timer nutze ich in 60 anderen Tiny1614 Projekten ohne Fehler.
Noch ein Nachtrag, aus Verzweifelung habe ich jetzt mal in die Loop folgendes gemacht:
1
if(TCD0.INTFLAGS)
2
{
3
PORTA.OUT^=(1<<PIN2_bp);
4
TCD0.INTFLAGS=TCD_OVF_bm;
5
}
Ich bekomme dann ein 1khz Signal an PA2. Das heißt die Timerhardware funktioniert. Entweder werden keine ISR global aktiviert über das sei() oder er sieht die ISR Routine im Compiler nicht.
In das ISR geht er auf jeden Fall nicht, auch im Debug erreicht er die nicht.
Wie kann ich prüfen ob sei global aktiviert ist, kann man da ein Bit abfragen?
Ich habe eher das Gefühl das der Compiler aber die ISR nicht sieht.
Hier mal der Auszug aus dem Dissembly. Ist das korrekt das da "no source file" steht?!
Ich habe das Problem gefunden. unglaublich. Es war das neue Tiny_DFP installiert (Version 2.xx). Ich habe es auf 1.3 gesetzt im General unter Assembler und Directions unter AVR/GNU C Compiler und schon geht mein Code wieder wie er soll!
$(PackRepoDir)\atmel\ATtiny_DFP\1.3.172\include
Verstehe tu ich das zwar dennoch nicht weil es mit dem neuen ja auch gehen sollte? Zumindest geht es aber nun
Edit:
Es ging 1x. Erneuter Compilierung geht der unveränderte Code wieder nicht...
und dito für die anderen CCP-geschützten Register.
Das ist ein Makro innerhalb von avr/io.h, das adäquaten (inline
Assembly) Code erzeugt.
Leider kein Unterschied. Das CCP vorweg (siehe Code) sollte das gleiche machen das man protected schreibt. Ich habe ja auch die 20Mhz/2 in der Loop vom Ausgangspin Toggle und auch bei Loop-Abfrage mit dem Timer 1khz. Das System läuft und passt. Die ISR Routine sieht der irgendwie im Compiler nicht
Es steht oben ganz oben drin.
PORTB.DIR = xyz
Wie gesagt, die Software ist FEHLERFREI.
In der ISR steht
PORTA.OUT ^= (1<<PIN3_bp);
Könnten Sie das einem ATtiny1614-Nichtkenner erläutern?
Was genau jetzt?
PORTx.DIR setzt das Register ob Eingang oder Ausgang. Bei Tiny/Mega früher war es das normale DDRx. Das ist einfach nur in Strukturen wie bei den Xmegas was ich deutlich besser finde.
PORTx.OUT ist wie früher das PORTx. Also Zugriff ob Low or High.
Es gibt noch Strukturen fürs direkte Setzen (PORTx.CLRSET oder PORTx.OUTSET) ich nutze aber primär OUT und mache dann ganz normal damit setzen, löschen oder togglen. Die XOR Verknüpfung dort hat nichts mit den Tiny zu tun ist ganz normale Toggle per Bitmanipulation.
Sonst haben die Pins eigene Strukturen zum aktivieren für Pullup oder Pin Interrupt usw. das geht dann mit PORTx.PINy_CNTR
Meine Frage ist, ob es da eine interne Korrelation zwischen PORTA und
PORTB gibt.
Setzen tu ich nur Pin3 von PortA in der ISR.
PORTB ist da nicht. ich habe nur bei er Init PORTA + PORTB komplett als Ausgang geschaltet außer PB0 als Eingang.
Gestern lief genau das gleiche Programm auch mit der ISR.
Dann wieder nicht mehr. Den gleichen Code vom Timer nutze
ich in 60 anderen Tiny1614 Projekten ohne Fehler.
Allmählich entsteht der Verdacht, dass Irgendwas/wer Programmversionen durcheinanderwirft.
Denn das ursprüngliche Programm kann so wie gezeigt nie gelaufen sein, auch nicht nach einer Neuinstallation:
Seit der Deinstallation, PC Neustart, Neuinstallation,
PC Neustart geht es wieder alles. Crazy.
Gestern lief genau das gleiche Programm auch mit der ISR.
Dann wieder nicht mehr. Den gleichen Code vom Timer nutze
ich in 60 anderen Tiny1614 Projekten ohne Fehler.
Allmählich entsteht der Verdacht, dass Irgendwas/wer Programmversionen
durcheinanderwirft.
Denn das ursprüngliche Programm kann so wie gezeigt nie gelaufen sein,
auch nicht nach einer Neuinstallation:
Seit der Deinstallation, PC Neustart, Neuinstallation,
PC Neustart geht es wieder alles. Crazy.
Verstehe ich nicht ganz. Was genau ist gemeint?
Das Programm lief per Timer im ISR. Und das Programm was ich da gepostet habe in einem weiter unterem Kommentar, das lief und läuft jetzt nicht mehr. Er springt einfach nicht in die ISR. Als würde die gar nicht existieren.
? - Was ist an dem Satz "Denn das ursprüngliche Programm kann so wie gezeigt nie gelaufen sein" nicht zu verstehen? Dort wird PORTA.DIR nicht gesetzt, trotzdem soll PORTA.OUT funktioniert haben, nach einer Neuinstallation - das passt nicht zusammen.
? - Was ist an dem Satz "Denn das ursprüngliche Programm kann so wie
gezeigt nie gelaufen sein" nicht zu verstehen? Dort wird PORTA.DIR nicht
gesetzt, trotzdem soll PORTA.OUT funktioniert haben, nach einer
Neuinstallation - das passt nicht zusammen.
Verstehe. das ursprüngliche da fehlte PORTA.DIR = 0xFF.
Das war drin. ich hatte mal die Pins gewechselt. Nicht verunsichern dadurch.
Das programm wie gepostet geht natürlich nicht. unabhängig davon muss er ja in den Breakpoint springen und das tut er halt auch nicht.
Da wird nur PORTB gesetzt - habe ich nicht darauf geachtet, weil Du ja von einem Compilier-Problem geschrieben hast.
Das gibt es nach wie vor bei mir nicht - auch die ISR wird korrekt angesprungen (wie zu sehen ist auch im internen Debugger) es passiert halt logischerweise nichts am PIN.
Das Interrupt-Flag muss man übrigens nicht zurücksetzen, das macht der Interrupt-Handler.
S. Landolt meint (wie Du sicher auch weisst) das:
Da wird nur PORTB gesetzt - habe ich nicht darauf geachtet, weil Du ja
von einem Compilier-Problem geschrieben hast.
Das gibt es nach wie vor bei mir nicht - auch die ISR wird korrekt
angesprungen (wie zu sehen ist auch im internen Debugger) es passiert
halt logischerweise nichts am PIN.
Das Interrupt-Flag muss man übrigens nicht zurücksetzen, das macht der
Interrupt-Handler.
Genau, etwas weiter im Verlauf ist das PRogramm gepostet, womit ich nur gearbeitet habe. Ich habe das obere korrigiert.
Nachdem ich den Chip getauscht habe, ging es. Software drauf, ging. Dann meine echte Firmware (das oben ist ja nur Testprogramm) ging wieder nicht. Chip wieder runter, neuer drauf. Gleiches. Ging wieder. Dann habe ich die Fuses verglichen und warum auch immer ist bei BOOTEND = 0x02 reingekommen das muss auf 0x00 sein, wie das sonst auch in meinen projekten überall der Fall ist.
Sobald das auf 0x02 ist, geht es nicht mehr. Wenn das auf 0x00 ist, geht es wie gewünscht!
Bei einem ATtiny1614, stimmt das? Kann ich aus dem Datenblatt nicht
herauslesen.
Da bin ich wohl "XMEGA-versaut".
Ich so auch nicht, im Debugger passiert es nicht und einen Tiny1614 habe
ich nicht - nehme es also zurück.
Bei den alten Mega/Tinys macht das der Handler.
Bei Xmega muss man es selber machen
Bei den neuen Tiny0,1,2 oder Mega0,1 Series muss man es auch selber machen (zumindest hier noch so in Erinnerung als ich damals als die rauskamen meine Libs geschrieben habe für das ganze Peripherie Zeug)