- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

Thema: Timer1 als Gesamtlaufzeit-Zähler möglich?

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi, PsiQ.

    Glückwunsch zum Durchbruch!

    Ich hab jetzt allerdings nicht alles gedanklich nachvollzogen.
    Die zwei Zeilen je Befehl rühren daher, dass in 4Bit-Mode ebenfalls 8 Bit übertragen werden müssen für einen kompletten Befehl, nur eben in zwei 4Bit-Häppchen zerteilt, die nacheinander in das LC-Modul reingetickert werden müssen. Vielleicht klärt das schon die Fragen. Vielleicht sind Spruts Kommentare nicht ganz deckungsgleich mit der letztendlichen Funktionalität.
    Kläre mal den Controllertyp den Displays ab und besorge dir genau dieses Datenblatt. Das ist -unabhängig vom individuellen Displayprodukt- die Referenz für diese Fragen. ( Spezieller wird es aber, wenn es um die Adressierung der Anzeigepositionen geht: Die ist tatsächlich modellabhängig, da hilft auch kein DB eines ähnlichen Displays !) Nach deinem Erfolg durch Displaywechsel kann man wohl nur konstatieren, dass das erste Display nicht ganz HD44780 (oder wie der heißt)-kompatibel ist. Ich hatte schon mal den Fall, dass am LCD-Board "lediglich" die Anschlüsse von +5V und GND sowie die Pin-Numerierung gegenüber dem Standard vertauscht waren ... ...ein nettes Verwirrspiel. Prüfe vielleicht auch das beim ursprünglichen Display.

    ob nun 4.096 oder 4.000 ist ja fürs Programm erstmal egal
    aber am Schluss nicht vergessen, gell!

    Leicht OT:
    Noch ein Vorschlag zum leichteren IC-Wechsel, sofern zukünftig mal wieder erforderlich:
    (die Idee stammt nicht von mir!)
    Den Chip in einen Sockel mit Präzisionskontakten einsetzen und dann stets in diesem Verbund zwischen den Standardssockeln hin und her wechseln. Im Havariefall kann dann der Transportsockel erneuert werden und der Chip wird geschont.

    Jetzt endgültig OT:
    Der Königsweg ist aber ein In-Circuit-Programmiersystem (ICSP); da kann der Chip in der Zielhardware verbleiben und dort programmiert werden. Je nach Geschmack wird das evtl. noch von der Variante mit Bootloader getoppt, die ich aber noch nicht ausprobiert habe. ICSP möchte ich nicht mehr missen. /OT

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    IC-Sockel / ICSP:
    Auf dem Bild sieht mans leider nicht so genau,
    aber die PIC hab ich genau in sonem Sockel stecken um se zu schützen,
    sonst sind die nach paar mal hin und herstecken ihre Beinchen durch Bruch los.
    Hab keinen Nullkraftsockel da, und das mit dem ICSP machts Layout nochmal komplexer. (Das Velleman hat aber auch n ICSP Port)
    Da ich jetzt aber aufm Programmierboard entwickeln kann ist das ja erstmal egal.
    --Einen PIC hab ich mit Überspannung gekillt, weil der erste verlötete Regler bei Last dann nicht mehr richtig garbeitet hat
    und plötzlich mal 10V anlagen. 2x Pic16F628A hab ich nun noch

    Und wenn die Software läuft, muss ich halt die Hardware einmal lauffähig hinbekommen, die kann ich ja nun gegenchecken.

    Thema LCD:
    Ich hatte dieses 16x2 auch kurz an "meiner" Platine dran, wo es auch nicht mehr als eine schwarze Zeile produziert hat.
    Beim 4x20 habe ich jetzt (glaubich) bei der Initialisierung ein paar Unterschiede gesehen, aber das kommt dann erst später.

    Ich vermute ein Problem mit dem Quarz/Takt, da die Schaltung sonst an für sich ja recht simpel ist.
    Ich muss mal schauen ob mein altes tragbares Oszi (ca 1988 ) soviel Mhz messen/anzeigen kann.
    Auf dem Sondenstecker steht zwar "40Mhz / 10:1", aber obs die Elektronik auch kann muss sich zeigen.

    Programm:
    Ich habe gestern noch stundenlang im Programm gefuhrwerkt und das um EMS ZMS und HMS ergänzt( 1 mS, 10mS, 100mS,)
    sowie die Wait Routinen und die Vorteiler von 32khz auf die 4Mhz angepasst.
    Leider war am Ende dann zwar ein fehlerfreies Compilieren möglich,
    aber die Uhr machte keinen Mucks mehr auf dem Display, nur noch 00:00:00.

    Irgendwann starrt man nur noch auf den Schirm und wenn man ne Minute was anderes macht,
    hat man keine Ahnung mehr was man eigentlich grade da gemacht hat ...


    PS.: Danke für die Betreuung !
    GrußundTschüß \/
    ~Jürgen

  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Hi, Jürgen.

    Zitat Zitat von PsiQ Beitrag anzeigen
    PS.: Danke für die Betreuung !
    Bitte entschuldige die Überbetreuung. Ich hatte deinen Beiträge-Zähler nicht im Blick.
    Bei Vellemann-Benutzern springt immer mein "ich-will-doch-nur-dein-Bestes"-Syndrom an. Ich glaub, ich hab da ein Vorurteil

    Gruß
    Christian.

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    Also das war von mir ernst gemeint mit dem "Danke für die Betreuung", da war 0,0% Ironie dabei

    Das Velleman macht ja nun was ich will, auch wenns n Mist war
    und immernoch ist mit dem RS232 gelumpe dabei.

    Ich kaue jetzt heute (also seit gestern da nun 02:30 ist) schonwieder seit 6 Stunden am Assembler Code rum,
    und habe jetzt Schrittweise das 10Mhz Beispiel auf meine 4.096Mhz umgemodelt (wohl eher massakriert).
    Es läuft etwas zu langsam, weil der Quarz ja nur 4.000Mhz hat (hoffentlich mit .000 ohne Abweichung )

    Ich hab es auch hinbekommen, dass ich den Timer laufen lasse und im "Stopp" Moment
    die ZeitWerte alle kopiere.

    Beispiel: Im Programm schreibt der laufende Timer seinen Wert in EM, also in die EinerMinute,
    und stellt diesen EM dann auf dem LCD dar in Zeile 1.

    Im Moment von "Stopp" schnappe ich mir den Wert, und kopiere ihn von "EM" nach "work",
    und von da dann weiter nach "A_EM".
    "A_EM" ist "Anzeige_Einer_Minuten".

    Die Hauptuhr läuft fröhlich über den Interrupt weiter,
    A_EM steht auf dem zuletzt kopierten Wert beim Tastendruck

    Das funktioniert auch, ich habe den Wert einfach nach einem "_" als Leerstelle auf dem LCD dahinter(hinter dem Haupttimer) anzeigen können.

    Allerdings verstehe ich nicht wie ich im assemblercode in die 2. Zeile des LCD springen kann um dort weiterzuschreiben.

    In Spruts LCD Beispielen schreibt er auf seinem 16x2 LCD immer nur in Zeile 1 von ganz vorne.

    Ich sehe zwar noch das "Cursor Home", also wohl "Zeile 1, erste Stelle",
    finde (verstehe) aber im Datenblatt nicht wie ich den Cursor dann in
    "Zeile 2, 1.Stelle" schicke um dort weiterzuschreiben.

    -- Einfach 5 Leerstellen schreiben um damit in Zeile 2 zu landen hat leider nicht funktioniert --

    Zur Veranschaulichung: so siehts grade aus:
    00:00:00:00_ _ _ _ _ => Haupttimer, HH:MM:SS:[ms][ms]
    _ _ _ _ _ _ _ _ _ _ _ => hier soll "letzte Stoppzeit" rein


    Ansonsten bin ich grade recht erfreut wie "einfach" ich das bis auf die Anzeige heute mit
    etwas "copy paste" und nachgrübeln hinbekommen habe.

    Fehlt nur noch das in die 2. Zeile schreiben..
    Und da dort vermutlich das mit dem 16x1 LCD zu 16x2 LCD mit drin steckt,
    klappts evtl sogar mit dem 20x4 hinterher.

    Ich schreib grad übrigens immer noch alles in Notepad um,
    war beim Fehlersuchen vom Compiler etwas blöd weil Notepad
    keine Zeilen-nummerierung anzeigt .
    Muss mal schauen ob das "Notepad+" nicht konnte.


    Zusammenfassung:
    Wie springe ich zu "Zeile 2, 1 Stelle"
    Erweiterung:
    Wie Springe ich zu "Zeile 3" und "Zeile 4" beim großen LCD...

    Das Datenblatt zu meinem 16x2 ist da bei reichelt.de bei "Datenblätter & Downloads" zu finden:
    http://www.reichelt.de/Hintergrund-g...=0&OFFSET=500&

    "Cursor Home" nutzt mir ja nichts,
    aber steht das evtl im Datenblatt auf S.8 (unten) bei "Display Data Ram Address Map" -?-
    Oder ist das hinter "Display shift" versteckt ? .. Oder wo sonst?


    -- Danke soweit mal! --




    @-it nach Mittagessen heute:
    Also im Datenblatt finde ich auf Seite "P.8 of 17"
    unten die Display Data Ram Adress Map, da steht was von First Line / Second Line
    wobei letztere bei 40H liegt. => Das wäre DD RAM adress

    Im Datenblatt steht ausserdem noch auf "S.5 of 17" eine Tabelle mit Steuerkommandos,
    bei "Set CG RAM ADDRESS"
    steht dabei "CG RAM ADDRESS (corresponds to cursor adress)"

    wenn nun "cursor adress" = Cursorposition ist muss das da wohl rein.
    Ich verstehe bzw sehe aber in Spruts Erläuterung immer noch nicht wo genau nun die Position eingestellt wird und vermute,
    er schreibt einfach immer ausgehend von der "Cursor Home" Position.
    - Ist zwar prinzipiell etwas blöde, aber ich werde nachher mal (ev mitm loop) einfach 16+14 Zeichen schreiben,
    ob ich dann irgendwann mit dem nächsten Zeichen bei Zeile 2 / Position 1 lande.
    Initialisiert wird das LCD jedenfalls als 2 zeilig.


    -----------
    @-IT nun ists 18:00:
    Ich habe jetzt mal die Zeichen primitiv+brutal weitergeschrieben,
    also die erste Zeile voll mit 16, dann nochmal ca 20 die man nicht sieht...
    Habs paarmal real getestet und danach die Spam-Stellenzahl +/- korrigiert.
    Nun lande ich mit "Zeit 2" und "Zeit 3" wie gewünscht in der 2. Zeile,
    wobei ein LCD 20x2 besser wäre als das 16x2,
    da gehen mir nämlich die Stellen für 2 Zeiten aus.

    Sieht aufm LCD nun so aus:
    00h:00m:00s,00ms
    0:00,00#0:00:00,00

    Wobei ich das in der 2.Zeile wohl noch nach
    0:00,00##0:00,00
    vereinheitlichen werde.

    Den Zehn Minuten + Stundentimer kann man ja von der großen Uhr in Zeile 1 ablesen,
    und mit etwas Gehirn merkt man dann ja wenns über 9:59,99 waren
    und wieder 0:01,xx dasteht

    Jetzt muss ich mich darum kümmern, dass beim Betätigen von "Stopp", der Wert nur einmal von
    "zuletzt gemessene Zeit" (rechts unten)
    nach
    "vorherige Zeit" (links unten)
    kopiert wird, und nicht dauernd mitläuft.

    Dafür weiß ich nun, dass der Unterschied bei schnellem rumgehoppel auf dem Schalter mal +10mS Differenz sein kann, meist steht aber bei beiden Zeiten sogar 1:1 das gleiche drin.

    Jetzt muss ich mir "nur" noch eine if goto else schleife einfallen lassen,
    die beim Drücken von "Stopp" nur einmal durchlaufen wird, und dann
    da das kopieren der letzten beiden Zeiten reinpacken.

    Dann den Port A aktivieren (hab ich schon, nur nix dran),
    und dort die "Start" "Stopp" "Reset" Tasten einbinden und entprellen,
    wobei ich das entprellen und das "nur einmal kopieren bei Stopp"
    wohl dort kombinieren könnte.
    Da werde ich wohl mit Zwischenspeicherbits
    Start equ xx
    Stopp equ xx
    Reset equ xx
    arbeiten und die Tastenwerte High / Low da reinschreiben,
    und mit decfsz evtl zurück oder weiter springen..

    edit:
    A)
    Sind nach den 16 Zeilen in zeile eins nochmal 24 Zeichen,
    also insgesamt wirklich 40 in Zeile 1,
    dann kommt das nächste in Zeile 2 / Pos1 raus bei 41.

    B)
    Habe mir nun Notepad++ runtergeladen,
    das machts bisschen bunter und zeigt mir die Zeilen-Nummer an.

    So, jetzt erstmal n Kaffee.. Ich fühle ich nähere mich dem Ende!
    Geändert von PsiQ (06.06.2013 um 17:27 Uhr)
    GrußundTschüß \/
    ~Jürgen

  5. #15
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Zitat Zitat von PsiQ Beitrag anzeigen
    Also das war von mir ernst gemeint mit dem "Danke für die Betreuung", da war 0,0% Ironie dabei
    Nein, nein, ich hab da keine Ironie rausgelesen; und die "Überbetreuung" hab ich mir ja selbst zugeschrieben.

    Zitat Zitat von PsiQ Beitrag anzeigen
    Ich hab es auch hinbekommen, dass ich den Timer laufen lasse und im "Stopp" Moment
    die ZeitWerte alle kopiere. . .
    Es besteht ja das Risiko, dass während der Ablesung mehrerer Bytes ein Zählerinkrement dazwischenkommen kann, wo dann ein Überlauf eine inkonsistente Ablesung bewirkt. Da sollte man ein Auge drauf haben. Das andere beschriebene Umkopieren hab ich nicht verstanden.

    Mein Vorschlag: Wenn ein STOP (oder auch LAP) erkannt wurde, den nächsten Count im LeastSignificant-Byte abpassen (pollen!) und dann flugs alle Bytes kopieren.
    Ein Delay macht sich immer gut. Nach dem Zeitnehmen kann man im Hauptprogramm dann eine Sperrzeit einbauen. 0,3 s beispielsweise wird man nach dem Zeitnehmen gar nicht wahrnehmen und lösen den Konflikt.

    Zitat Zitat von PsiQ Beitrag anzeigen
    Allerdings verstehe ich nicht wie ich im assemblercode in die 2. Zeile des LCD springen kann...
    In Spruts LCD Beispielen schreibt er auf seinem 16x2 LCD immer nur in Zeile 1 von ganz vorne...
    Ich sehe zwar noch das "Cursor Home", also wohl "Zeile 1, erste Stelle",
    finde (verstehe) aber im Datenblatt nicht wie ich den Cursor dann in "Zeile 2, 1.Stelle" schicke um dort weiterzuschreiben.
    Das hatte ich oben schon mal angedeutet. Aus meinem Gedächtnis: Die HD44780 (oder wie der heißt)-kompatiblen LC-Controller können bis zu 80 Zeichen darstellen, d.h., 16x2-LCDs zeigen immer nur eine Teilmenge des Zeichenspeichers an. Je nach Schaltungsdesign werden also verschieden Speicherbereich sichtbar gemacht. Das können mal die ersten 32 Speicherstellen am Stück sein oder eben 0..15 und dann erst wieder 40..55 (jeweils dezimal). Versuch einfach mal für die zweite Zeile den Cursor auf Vielfache von 16 oder 20 zu positionieren. Das dürften eigentlich die möglichen Werte sein. Dann weiter sequentiell schreiben.
    Grundsätzlich kann man ja alle 80 Zellen beschreiben und durch links/rechts-scrollen des Anzeigefensters sichtbar machen.

    Ich schreib grad übrigens immer noch alles in Notepad um,
    war beim Fehlersuchen vom Compiler etwas blöd weil Notepad
    keine Zeilen-nummerierung anzeigt .
    Muss mal schauen ob das "Notepad+" nicht konnte.
    Aversion gegen IDEs?
    Ich finde MPLAB(X) OK. Ja, riesig, aber was soll's, so lange der Rechner nicht ins Stocken kommt... Der Zugewinn an Komfort überwiegt für mich. Hab am Anfang (damals beruflich, vom Kollegen vorgeschlagen) mit Batch und Editor gearbeitet. Hab ich eher als mühsam empfunden.


    Zusammenfassung:
    Wie springe ich zu "Zeile 2, 1. Stelle"
    Erweiterung:
    Wie Springe ich zu "Zeile 3" und "Zeile 4" beim großen LCD...
    2. Zeile 1. Zeichen vermutlich 40dez.
    bei 16x4 dürften die Zeilenanfänge relativ sicher 0/20/40/60dez sein.

    "Cursor Home" nutzt mir ja nichts,
    aber steht das evtl im Datenblatt auf S.8 (unten) bei "Display Data Ram Address Map" -?-
    Ja, genau da steht es schwarz auf weiß.

    So, jetzt hat sich einiges mit den Nachträgen überschnitten, scheint sich aber gegenseitig zu bestätigen.

    Ich fühle ich nähere mich dem Ende!
    Welchem Ende ? Doch nicht so kurz vor dem Ziel !

    Gruß
    Christian.

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    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
    GrußundTschüß \/
    ~Jürgen

  7. #17
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Huihui, viel Text und viel Info. Leider bin ich nicht so fix um das alles in vertretbarer Zeit nachzuvollziehen.
    Zu drei Dingen kann ich allerdings was sagen.

    1.) Der Pin RA4 ist -so weit ich weiß- bei allen PIC16Fxxx ein Open Collector-Ausgang. Daran kann nur eine Spannung gemessen werden, wenn auch ein Widerstand, z.B. 10kOhm, nach +5V angeschlossen ist. Der Open Collector (ein schlichter Transistor, dessen Kollektor unbeschaltet nach aussen geführt ist) für sich alleine kann nämlich nur Strom nach GND fließen lassen oder eben nicht.
    (Zweck des RA4 dürfte die Anbindung des Controllers an Wired-Or-Leitungen sein, die einen etwas höheren High-Pegel als nur +5V führen. Sehr viel mehr geht da aber auch nicht, ich erinnere mich, Maximalwerte im nur einstelligen Voltbereich gelesen zu haben.)

    2.) Geht es bei den Flagvariablen um das Anzeigen von Informationen (z.B. Debugging) oder um reine Arbeitsflags? Im letzteren Falle sind Portpins Verschwendung, du kannst Flags bis zum Abwinken im RAM selbst definieren.
    Es wird mittels "flag equ 0x20 ; nur ein Zahlenbeispiel" eine beliebige RAM-Speicherzelle für acht Flags mit dem Verwaltungsnamen 'flag' belegt.
    Die einzelnen Flagbits werden mittels "einflag equ flag.1 ; erstes Flagbit", "nocheinflag equ flag.2 ; zweites Flagbit" usw. usf. sinnvoll benannt und können im Code per "bsf einflag" oder "btfss nocheinflag" referenziert werden. Das ist zugleich maximal effiziente Speicherausnutzung, es stehen alle acht Bits je RAM-Byte als Flags zur Verfügung. Das ganze macht relativ viele Source-Zeilen, verbraucht aber keinen einzigen Programmspeicherplatz, weil es sich nur um Verwaltungsinformationen für den Assembler handelt.
    In gleicher Weise können auch die Portleitungen des Controllers mit sprechenden Namen versehen werden.

    3.) Die ALU der PIC16-Familie kennt nur Carry- und Zero-Flag als Output der Befehlsabarbeitung; beide stehen im STATUS-Byte. Alle anderen dokumentierten Flags dienen der Steuerung der Controllerhardware oder sind Ergebnisse von Ereignissen in der Umwelt oder der Controller-Peripheriemodule UART, Timer etc.

    Noch ein Letztes: Hast du im Code irgendwo die Analog-/-Digital-Eigenschaft des Port A verändert? Das würde sich eventuell mit der digitalen Nutzung beißen: Analogpins werden digital als Low gelesen, egal was wirklich am Pin los ist.

  8. #18
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    So, fertig! => Funktioniert alles

    Habe jetzt mein Ampel-10-Zeilen-Unterprogramm gelöscht, und ganz simpel ersetzt durch

    (Im Main Loop)
    btfsc PORTA,2 ; Wenn Taster an RA2 gedrückt
    bsf PORTA,3 ; schalte Ampel An (RA3 HIGH)

    Und in der Start und der Stopp Subroutine fange ich an mit
    bcf PORTA,3 ; Ampel ausschalten


    Zu1.:
    Irgendwo hab ich im Datenblatt was gelesen zu dem RA4 und der Spannung (Referenz, Messung??), aber dachte wenn ich den "digital Einschalte" wie den Rest ist das erledigt.
    -- Nunja, jetzt kann er machen was er will, weil ich ja jetzt eine freie Flag definieren kann
    Das dürfte wirklich die Erklärung für das Problem sein, der kann sich garnicht aktiv High oder LOW setzen.

    Zu 2.: Flags als Anzeigen:
    Ich brauche/möchte das Ampel Flag und das Startflag
    anzeigen auf einer LED.

    - Über die LED am Startflag sieht man, dass Reset erfolgt ist und alles bereit ist.
    - Über die Ampel LED schalte ich eben auch diese Ampel an.

    Das Stoppflag brauche ich nur Softwareintern um das ständige Überschreiben der alten Zeiten bei Stopp zu verhindern,
    das habe ich nun nur noch virtuell.
    => Da habe ich am Ende nochmal richtig was gelernt, irgendwie war mir zwar bewusst ich kann etliche Variablen definieren,
    habe das bei "Flags definieren" aber nach anfänglichem rumtesten+Fehlschlag als nicht möglich angenommen

    Hatte mir schon überlegt die Variante mit Tastatur+LCD an PortB anzuschauen, das geht ja auch noch für Eingänge,
    aber das passt nun schönerweise mit den Ein+Ausgängen genau wie ichs brauche.

    Zu 3.:
    Ok, also hat das "STATUS" gar nichts mit den restlichen virtuellen Flags zu tun.
    Da mangelt es etwas an Ausführlichkeit bei Sprut bei der Beschreibung und im Quelltext.

    Zum letzten:
    Nein, nun klappt auch alles. (ohne RA4 zu nutzen) Ich habe alles deaktiviert was ging (CCP),
    und entsprechend beim init die Ports auf Input / Output gestellt wie ichs gerne hätte.
    Und nichts extra "aktiviert".

    Abschluss:
    Habe mein Velleman 8048 weiter gepimpt, und nun auch an RA0 bis RA3 LEDs parallel zu den originalen Tastern, die ich per Jumperbrücke zuschalten kann.
    - War nötig weil ich beobachten wollte ob/wie mein Programm die Flags setzt.
    Original werden die Ports per 10k Widerstand nach Masse gezogen, die Taster schalten gegen +5V / HIGH.

    Das 20x4 LCD habe ich noch nicht zum Laufen bekommen, habe am LCD und den LCD Pins Stiftleisten / Buchsen verlötet,
    so dass ichs einfach aufm Velleman um/einstecken kann. - Da muss ich beim initialisieren wohl nochmal reinschauen.

    Bis Freitag kommen hoffentlich von Amazon noch 3 Stück 20x4 in blau, für nur 8 euro das Stück inklusive Versand,
    mit HD44780 Controller, dann habe ich noch andere 20x4 zum Testen.

    Werde die Tage jetzt mal die Lochrasterplatine neu bauen/kontrollieren wenn ich Zeit + Lust habe, und schauen dass die läuft.
    Und mal mitm 4.096er Quarz n paar Stunden Uhrenvergleich machen.

    Frage am Rande: Gibt es irgendwo billige Fertigplatinen mit PICs a la Arduino?
    Habe den Pinguiono gefunden und andere Open-Source Projekte, aber kein einfache, fertige und bezahlbare Platine wie es von Atmel
    soviele gibt. Sowas um 25Euro mit Spannungsregler, IC, Quarz und rausgeführten Anschlusspins.
    - Nicht dass ich's nicht kann, aber ich will keine Platinen mehr Ätzen/Bestücken und Fehler suchen, wenns nicht sein muss.

    ... Hab grad keine Lust das ganze Theater nochmal fürn Arduino micro zu machen ...
    GrußundTschüß \/
    ~Jürgen

  9. #19
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    Habe heute meine LCDs 20x4 in blau erhalten. Habs auf amzon bestellt da recht günstig/Versandkostenfrei, sind aber lange Lieferzeiten angegeben.
    Offiziell hätte es noch bis 8.Juli dauern dürfen, nun sind se aber heute gekommen. werden wohl auch über Ebay verkauft.
    (amazon/ emall supply / 20x4 lcd modul, blau/weiss 7,99)
    Auf dem Display steht noch
    QC2004A (sure electronics)
    Darüber findet man ein sehr kurzes Dateblatt, was in mir erstmal Sorgen fürs Initialisieren verursacht hat.
    Laut Angabe im Datenblatt wird aber ein HD44780 verwendet (kein Ersatz).
    Also schnell die Pins geprüft, passen zum Standard, den Kontrastpin nach gnd gebrückt...
    einfach angesteckt an meine Platine ... und ... funktioniert sofort + astrein!
    Im Originalprogramm habe ich 2x16 Zeichen ausgegeben,
    und dazwischen sinnlose Lückenfüller.

    Auf dem 4 Zeilen LCD werden nun alle Zeichen die in den Puffer passen angezeigt,
    Zeile 1+3 entspricht der oberen Zeile beim 16x2 (Summe 40 Zeichen)
    Zeile 2+4 der 2. Zeile beim 16x2. (Nochmal 40 Zeichen)

    Bild hier  
    GrußundTschüß \/
    ~Jürgen

  10. #20
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    Ich habe mir jetzt mal den Pinguino geordert ( http://www.watterott.com/de/PIC32-PINGUINIO ) auf den ich dank dem hinweis im anderen Thead gekommen bin.

    Gleichzeitig überlege ich gerade ob ich bis der kommt mit dem Arduino den ich nun hier liegen habe das machen soll ... ... .. hmm.

    Mein Assembler Code ist ja nun für den PIC16F628A geschrieben...
    Wenn ich da die entsprechenden I/O Pins und den Quarz(Frequenz) anpasse,
    ist der Code dann auch auf dem PIC32MX440F256H lauffähig?

    Wenn ja:
    Ich würde dann den Pausentimer (wait kram) von den 4.096 auf den 8Mhz Quarz anpassen,
    und dann das Programm noch um eine Stelle vor [1ms] mit passendem krummen Vorteiler einfügen.
    Muss noch schauen obs immernoch Frequenz= Quarztakt:4 ist oder der dann im 1:1 Takt läuft..
    Dann die 4 Taster und LCD Pins Portmäßig hinbiegen, und die 3 Ausgangs-LEDs...
    und paar andere Sachen die ich grade vergesse ...

    - ich will irgendwie ungern auf Hochsprache wechseln wo ichs nun so effizient und klein geschafft habe.
    GrußundTschüß \/
    ~Jürgen

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Ähnliche Themen

  1. Problem mit Timer1 als Counter im CTC Modus und Interupt
    Von Anam52 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 26.02.2013, 15:34
  2. Variablenschar als Schieberegister möglich??
    Von drivepro82 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 05.10.2008, 14:06
  3. Mehr als 7 Defchar. Möglich?
    Von Jon im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 01.01.2007, 19:45
  4. Mini-Auftrag: Microcontroller als Zähler mit RS232
    Von frank-findus im Forum Elektronik
    Antworten: 12
    Letzter Beitrag: 07.11.2006, 09:34
  5. Welchen IC als Decoder / Zähler
    Von Lorenz im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 28.10.2005, 13:21

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress