Also irgendwie ist die Benachrichtigungsfunktion kaputt, hab deine Antwort garnicht mitbekommen...
Aber hab auch so quasi alles hinbekommen
Hab erstmal 2 Tage vom Programmieren Abstand gehalten, nur mit Stift+Zettel,
und Hardware gelötet.
Habe die Ports von meinem Z77 Pro4 genau nach Anleitung mit Hilfe der Wikipedia Pinbelegung abgeglichen und eine Buchsenleiste passend ans RS232 Kabel gelötet,
und jetzt funktioniert der alte Velleman 8048 auch an meinem großen PC und ich muss nicht mehr mühsam am Fernseher(PC) aufspielen...
Das Programm macht alles was ich will, aber ich habe gerde Probleme mit einem SpeicherFlag zuwenig.
Es tut (hat getan) alles was muss, aber der Bonus = Ampelfunktion ärgert mich grade.
Also was es nun kann:
Reset/MCLR => Zeiten Nullen
LCD sieht dann so aus:
Code:
00h:00m:00s,00ms
0:00,00//0:00,00
StartFlag RA1 ist HIGH nach RESET
Ich springe dann solange beim Auftreten des Interrupts wieder aus dem Timer0 Interrupt raus (goto Int_end) , solange ich die Zeit nicht starten will, also kein Startsignal kam.
Wenn Startsignal kommt, setzte ich StartFlag RA1 = LOW, und springe nicht mehr im Interrupt zum Ende sondern zähle die Zeit hoch, wie original bei Sprut.
Damit läuft die Zeit in "Zeile 1".
Wenn nun "Stopp" kommt, schreibe ich die Zeit von "1.Zeile"
nach "2.Zeile rechts"
und verschiebe vorher "2.Zeile rechts" nach "2.Zeile links".
Ich habe also aufm LCD
Code:
[ aktuelle laufende Zeit ]
[vorherige Zeit]/[neueste Zeit]
Das passt soweit alles... äääh. wie beschreibe ich mein Problem:
Mir fehlt eine Speicher-Flag,
das ich mit bsf / bcf benutzen kann
... ... ...
Die Zeit wird bei Stopp HIGH=>LOW nur einmal übertragen,
und erst nach einem LOW=>HIGH und dann wieder HIGH=>LOW erneut überschreiben.
Habe da auch gleich den Taster mit 100ms entprellt und das Dauerkopieren beim Tastehalten beseitigt.
(Das jemand mit 100ms differenz 2x durchs ziel rennt=Stoppt ist unsinn)
--- Dafür brauche ich ein StoppFlag => RA4 (PORTA,4)
Fürs Startflag um die Zeit nicht hochzuzählen
bis "Start" kommt brauche ich das StartFlag = RA1 (PORTA,1)
Und dann will ich noch einen Ampelausgang = grün per Taster aktivieren,
den ich dann in RA3 (PORTA,3) speichere + als Ausgang zum LED-Cluster-Treiber benutze.
SpeicherFlags Übersicht:
Start = RA1
Ampel = RA3
Stopp = RA4
dazu brauche ich noch paar Eingänge:
Stopp => RB1
Start-Taster => RA0
Ampel An => RA2
Wenn man sich die Ports anschaut, passt das theoretisch genau:
PORT A:
RA0 - Startsignal Taster
RA1 - StartFlag
RA2 - Taster Ampel Ein
RA3 - Ampel Ausgang (zum Clustertreiber)
RA4 - StoppFlag
RA5 - MCLR (verwende ich als bequemes Reset ohne Codeaufwand)
RA6 - belegt vom Quarz
RA7 - belegt vom Quarz
PORT B:
RB0 - LCD Enable
RB1 - Taster Stopp
RB2 - LCD RS
RB3 - LCD R/W
RB4 - LCD D4
RB5 - LCD D5
RB6 - LCD D6
RB7 - LCD D7
So. Also theoretisch passts.
ABER! Ich kann RA4 nicht als Flag verwenden!
Ohne Ampelfunktion (RA2+RA3 somit frei) kann ich mein StoppFlag auf RA3 legen.
Dann funktioniert alles. Dürfte auch mit RA2 genauso klappen.
Wenn ich aber die Ampelfunktion nutzenl,
und entweder das AmpelAn Flag in RA4 speichern will,
oder das StoppFlag, klappt das nicht.
bsf / bcf PORTA,4
geht ohne Fehlermeldung oder Programmabsturz o.ä.
Aber es hat keine Auswirkung! Ich konnte auch keine Pegeländerung am PIN direkt am IC messen.
Ich habe probeweise (sehr ätzendes gesuche) im Code RA3 mit RA4 vertauscht, also AmeplFlag / StoppFlag vertauscht.
Einmal geht die Ampel nicht, einmal geht das StoppFlag nicht.
Der Code passt also, aber RA4 scheint sich nicht beschreiben/auslesen (bsf, bcf) zu lassen wie RA3, oder alle anderen RA Pins.
Ich habe am Velleman 8048 keine Verbindung oder Widerstand nach GND oder +5V messen können,
also kein Pullup oder Pulldown Widerstand, auch nicht direkt auf Masse oder +5V gelegt.
Ich sehe leider auf der 2 Layer Platine nicht, ob der Pin irgendwo hingeht, habe aber auch keine sonstige Verbindung zu in der Nähe befindlichen Widerstände / Pins gefunden,
der hängt also evtl komplett in der Luft.
- Nun 2 Fragen:
1. Liegt an RA4 irgendwas spezielles an was ich deaktivieren muss oder umstellen oder was den blockiert?
Den Comparator habe ich aus, die anderen Pins RA0 bis RA3 funktionieren ja auch.
2. Wenn ich RA4 einfach ignoriere (wie ohne Ampelfunktion)
Was für eine andere Flag-Speicherzelle kann ich nutzen, und wie definiere ich die ? Gibt es da noch eine/mehrere die nicht mit dem PortB oder PortA
als "hardware" real verbunden sind und nur "virtuell" vorhanden ?
Sprut schreibt leider nichts zu den vorhandenen Flags ausser dass es da welche in STATUS gibt, das Zero Flag und das Carry Bit.
Und im Programm definiert er noch ein Flag folgendermaßen:
#define neu Flags,0
Also kann er später mit
bsf neu oder bcf neu
das Flag Setzen/Löschen
---WAS PASSIERT--- jetzt wenn ich da einfach schreibe
#define StoppFlag Flags,7
oder
#define StoppFlag Flags,4
Was für "Flags" und wieviele gibts in dem Register "Flags",
und sind davon welche schon vergeben / fest vergeben ??
Wo sitzt da das Carry Bit oder das Zero Bit ??
Wie bastel ich mir ein Flag ?
Nur mit
"StoppFlag equ 0x49"
hats nicht funktioniert
weil bei
bsf was doppeltes erwartet wird im Sinne von
bsf Teil1,NummerTeil2
also wie
bsf PORTA,4
Hmm. hab grad beim Tippen nebenher über Google was gefunden..
( http://www.mikrocontroller.net/topic/4738 )
-- Eventuell muss ich da "equ" einfach doppelt verwenden:
Stopp equ 0x49
Flag equ 0x4A
und dann sollte das später so aussehen:
Code:
bsf Stopp,Flag ; Flag wird HIGH
oder
bcf Stopp,Flag ; Flag wird LOW
oder
btfsc Stopp,Flag ; (if) Stopp,Flag = High
return ; (then) return
shutdown ; (else) shutdown
Hmmmm. werde das mal testen, wenns klappt ist mir egal was RA4
macht oder nicht macht oder ob Velleman da auf der Platine was verbockt hat.
Hmmm hmmm hmmm.. Werde das versuchen jetzt noch "schnell" hinzubekommen,
damit ich s morgen nicht vergessen habe wo ich was ändern muss.
-- Brauche also erstmal noch keine Antwort bis ich klappt/ klappt nicht schreibe
Lesezeichen