Zeit in Matrix darstellen Probleme

Hydoxel

Neues Mitglied
30. Nov. 2016
7
0
1
46
Sprachen
  1. BascomAVR
  2. ANSI C
Hallo Zusammen,
ich habe eine kleines Problem. Beschäfftige mich seit kurzen mit mc und bin noch ein kleiner Anfänger.
Also folgendes ist mein Problem. Ich möchte eine Zeit/Uhr in einer Dot Matrix darstellen. Mit einer Timer Routine, also Minute +1 Stunde +1 etc funktioniert die Matrix auch wie sie soll. Dann habe ich einen Code gefunden mit dem ich meinen DCF1 ranhängen kann http://rn-wissen.de/wiki/index.php/DCF77-Decoder_als_Bascom-Library . Vorher mit dem Breadboard und LCD getestet. Erst kleine Empfangsprobleme, nach zwischenbau eines Singanlverstärkers innerhalb von 1-5 Minuten Funkzeit.
Also dachte ich mir, dass ich den Teil mit dem LCD aus dem Code lösche und meine vielen If schleifen in die Sub schreibe und schon leuchtet es fröhlich vor sich hin. Nur leider passiert nichts. Habe probiert die Zeitvariablen _min und _hour zu nutzen, allerdings auch da funktioniert nichts. In der Zwischenzeit habe ich so viel gelesen und probiert das ich völlig durch einander bin. Zwischenzeitlich hatte ich schon einen kleinen Erfolg, das die MAtrix mit der Softclock lief und dann ich nehem es an) beim stellen wieder resetet wurde. Leider habe ich diesen nicht mehr, da ich anscheint nicht pfiffig genug diesen zu speichern. Ich beutzte einen atm 16a, mit einer 6x8 Matrix einer 2x6 Matrix und einer 4X3 Matrix.
Es wäre echt Prima wenn mir mal einer auf die Sprünge helfen könnte wie ich weiter vorgehen kann oder muss.


Vielen Dank schon mal für eure Mühe


Code:
'###########################################################################
'Programmname: Decodertest.bas    Version 4.11
'
'Aufgabe:
'Es wird ein DCF-Empfänger (CONRAD 641138) an Portd.3 angeschlossen
'und DCF-Uhrzeit und -Datum auf dem LCD 4x16 ausgegeben.
'Dieses Programm ist ausgelegt für die Dcf77.lib ab V4.00.

'###########################################################################

$regfile = "m16adef.dat"                                    'ATmega 32
$crystal = 8000000                                          'Quarz: 8 MHz
$baud = 9600
$hwstack = 32                                               'hardware stack
$swstack = 10                                               'software stack
$framesize = 40                                             'frame space


$include "dcf77_soft.bas"


'###########################################################################
'Hauptprogramm:


Ddrd = &B11111111                                           ' D1-D6 Zeile einser Minten ; D7 Spalte 1 einser Minuten
Ddrc = &B11111111                                           'C0 - C6 Spalten 2 - 7 einser Minuten; C7 Spalte 1 fünfer Minuten
Ddrb = &B01111111                                           ' B0 - B2 Spalten Stunden ; B3 - B6 Zeilen Stunden
Ddra = &B11111110                                           ' A1 - A2 Zeilen fünfer Minuten ; A3 - A7 Spalte 2 - 6 fünfer Minuten
                                                            ' A0 Eingang DCF

Portd = &B00000000
Portc = &B00000000
Portb = &B01111000
Porta = &B11111111

Declare Sub Showtime()


Dim I As Byte
Dim Minute As Word
Dim Min_ein As Word
Dim Stunde As Word
Dim Sekunde As Byte



'---------------------------------------------------------------------------

'Hauptprogramm:


      Time$ = "02:11:00"



  I = 0

Dcfstatus.7 = 1
   Sekunde = 0
                                         'DCF-Decoder EIN

'****************** HAUPTPROGRAMMSCHLEIFE **********************************
'Testprogramm:
Do

  If Sekunde <> _sec Then

    Call Showtime()
    Sekunde = _sec

    End If





Loop

End

'************* ENDE HAUPTPROGRAMM ******************************************

Sub Showtime()


         If Dcfstatus6 = 1 Then
         _min = Minute
         _hour = Stunde



       If Minute = 1 Then
        Porta = &B00001010
        Portd = &B10111111 : Portc = &B00000000
        End If
        If Minute = 2 Then
        Portd = &B10111111 : Portc = &B00000001
        End If
        If Minute = 3 Then
        Portd = &B10111111 : Portc = &B00000011
        End If
        If Minute = 4 Then
        Portd = &B10111111 : Portc = &B00000111
        End If
         If Minute = 5 Then
        Porta = &B00000100
        Portc = &B10000111
        End If
         If Minute = 6 Then
        Portd = &B00111111 : Portc = &B10001000
        End If
         If Minute = 7 Then
        Portd = &B00111111 : Portc = &B10011000
        End If
          If Minute = 8 Then
        Portd = &B00111111 : Portc = &B10111000
        End If
        If Minute = 9 Then
        Portd = &B00111111 : Portc = &B11111000
        End If
        If Minute = 10 Then
        Porta = &B10000100
        End If
          If Minute = 11 Then
        Portd = &B11011111 : Portc = &B10000000
        End If
        If Minute = 12 Then
        Portd = &B11011111 : Portc = &B10000001
        End If
        If Minute = 13 Then
        Portd = &B11011111 : Portc = &B10000011
        End If
        If Minute = 14 Then
        Portd = &B11011111 : Portc = &B10000111
        End If
         If Minute = 15 Then
        Porta = &B11000100
        End If
         If Minute = 16 Then
        Portd = &B01011111 : Portc = &B10001000
        End If
         If Minute = 17 Then
        Portd = &B01011111 : Portc = &B10011000
        End If
          If Minute = 18 Then
        Portd = &B01011111 : Portc = &B10111000
        End If
        If Minute = 19 Then
        Portd = &B01011111 : Portc = &B11111000
        End If
        If Minute = 20 Then
        Porta = &B11100100
        End If
        If Minute = 21 Then
        Portd = &B11101111 : Portc = &B10000000
        End If
        If Minute = 22 Then
        Portd = &B11101111 : Portc = &B10000001
        End If
        If Minute = 23 Then
        Portd = &B11101111 : Portc = &B10000011
        End If
        If Minute = 24 Then
        Portd = &B11101111 : Portc = &B10000111
        End If
        If Minute = 25 Then
        Porta = &B11110100
        End If
        If Minute = 26 Then
        Portd = &B01101111 : Portc = &B10001000
        End If
        If Minute = 27 Then
        Portd = &B01101111 : Portc = &B10011000
        End If
        If Minute = 28 Then
        Portd = &B01101111 : Portc = &B10111000
        End If
        If Minute = 29 Then
        Portd = &B01101111 : Portc = &B11111000
        End If
        If Minute = 30 Then
        Porta = &B11111100
        End If
        If Minute = 31 Then
        Portd = &B11111101 : Portc = &B10000000
        End If
        If Minute = 32 Then
        Portd = &B11111101 : Portc = &B10000001
        End If
        If Minute = 33 Then
        Portd = &B11111101 : Portc = &B10000011
        End If
        If Minute = 34 Then
        Portd = &B11111101 : Portc = &B10000111
        End If
          If Minute = 35 Then
        Porta = &B00000010
        End If
        If Minute = 36 Then
        Portd = &B01111101 : Portc = &B10001000
        End If
        If Minute = 37 Then
        Portd = &B01111101 : Portc = &B10011000
        End If
        If Minute = 38 Then
        Portd = &B01111101 : Portc = &B10111000
        End If
        If Minute = 39 Then
        Portc = &B11111000
        End If
        If Minute = 40 Then
        Porta = &B10000010
        End If
        If Minute = 41 Then
        Portd = &B11111011 : Portc = &B10000000
        End If
        If Minute = 42 Then
        Portd = &B11111011 : Portc = &B10000001
        End If
        If Minute = 43 Then
        Portd = &B11111011 : Portc = &B10000011
        End If
        If Minute = 44 Then
        Portd = &B11111011 : Portc = &B10000111
        End If
        If Minute = 45 Then
        Porta = &B11000010
        End If
        If Minute = 46 Then
        Portd = &B01111011 : Portc = &B10001000
        End If
        If Minute = 47 Then
        Portc = &B01111011 : Portc = &B10011000
        End If
        If Minute = 48 Then
        Portd = &B01111011 : Portc = &B10111000
        End If
        If Minute = 49 Then
        Portd = &B01111011 : Portc = &B11111000
        End If
        If Minute = 50 Then
        Porta = &B11100010
        End If
        If Minute = 51 Then
        Portd = &B11110111 : Portc = &B10000000
        End If
          If Minute = 52 Then
        Portd = &B11110111 : Portc = &B10000001
        End If
        If Minute = 53 Then
        Portc = &B11110111 : Portc = &B10000011
        End If
        If Minute = 54 Then
        Portd = &B11110111 : Portc = &B10000111
        End If
        If Minute = 55 Then
        Porta = &B11110010
        End If
        If Minute = 56 Then
        Portd = &B01110111 : Portc = &B10001000
        End If
        If Minute = 57 Then
        Portd = &B01110111 : Portc = &B10011000
        End If
        If Minute = 58 Then
        Portd = &B01110111 : Portc = &B10111000
        End If
        If Minute = 59 Then
        Portd = &B01110111 : Portc = &B11111000
        End If
        If Minute = 0 Then
        Porta = &B11111010
        End If

       If Stunde = 1 Then
       Portb = &B00111100                                   ' Zeile 1 = B6 ... Zeile 4 = B3 0 =aktive
       End If
          If Stunde = 2 Then                                ' Spalte 1 = B2 .... Spalte 3 = B0   1 = aktive
       Portb = &B00111010
       End If
       If Stunde = 3 Then
       Portb = &B00111001
       End If
       If Stunde = 4 Then
       Portb = &B01011100
       End If
       If Stunde = 5 Then
       Portb = &B01011010
       End If
       If Stunde = 6 Then
       Portb = &B01011001
       End If
       If Stunde = 7 Then
       Portb = &B01101100
       End If
       If Stunde = 8 Then
       Portb = &B01101010
       End If
       If Stunde = 9 Then
       Portb = &B01101001
       End If
       If Stunde = 10 Then
       Portb = &B01110100
       End If
       If Stunde = 11 Then
       Portb = &B01110010
       End If
       If Stunde = 12 Then
       Portb = &B01110001
       End If





End Sub

'---------------------------------------------------------------------------

Getdatetime:                                                'Nicht genutzt!
Setdate:
Settime:
Return
'---------------------- Interrupt Routine DCF77 ----------------------------

Tim2_isr:
  Timer2 = Startwert
  Call Dcf77_soft
Return
 
Hi,
da hast du natürlich recht mit dem Punkt und dem End IF.
Irgendwann wohl beim schrieben und probieren etwas blind auf den Augen geworden :oops:
Nein das wird eine ganz " noemale" Uhr. Stelle eine Runde uhr vor, aus der Mitte laufen zu 3Uhr hin 10 leds = 10Minuten, die 5er bleiben als anhaltspunkte an, dann geht es weiter mit 20 Leds = 20 Minten zur sechs. Dann wieder sder Sprung zur Mitte und das gleiche noch einmal nur in Richtung 9 Uhr undann weiter zur 12Uhr. Die Stunden sind in 2 6er Blöcken verpackt, ein Block im Quadran von 3 bis sechs und der andere von dem entsprechen von 9 zur 12. Die Minten Leds beleuchten eine Abdeckung direkt, die Stunden sind doppel Leds die einen größeren Radius ausleuchten wodurch später ein Schattenwurf die die jeweilige Stunde anzeigt.
huch was hört sich das kompliziert an, ist aber ganz einfach. Hihi

Werde mal ein Bild anhängen wenn das geht.

Achja und danke für die Antwort

Gruß Hydoxel
 

Anhänge

  • Layout-Funk-Rund.jpg
    Layout-Funk-Rund.jpg
    221,7 KB · Aufrufe: 13
  • Uhr-Rund-Funk.jpg
    Uhr-Rund-Funk.jpg
    226 KB · Aufrufe: 13
Je mehr Leds leuchten, umso weiter ist es Richtung 12/24 Uhr? Hast du auch ein Schaltbild?
 
Fast, die Minuten LEDs füllen immer nur die Zwischenräume zwischen den fünfen, also wenn zB 11 Minuten nach 6 ist sind nur die beiden Fünfer Minuten an und eine eine nach der zweiten Fünfer , die in Fünfer sind natürlich anders farbig, damit am einen schnellen Überblick bekommt. Werde mal ein Bild machen wenn sie an ist, wie gesagt mit mit einer Timer Routine läuftbsi ja einwandfrei.
Ein Schaltplan habe ich nicht gemacht, habe mal eine Wortuht nachgebaut und mich daran gehalten, halt nur mit 3 anstatt einer Matrix. Ist aber ganz simpel aufgebaut, wenn Bedarf ist kann ich den ja mal einstellen.

Gruß Hydoxel
 
Hallo Hydoxel!

Erst einmal....
Willkommen im Forum! :ciao:

Puh, da hast du dir zu Beginn aber gleich einiges aufgeladen. :rolleyes:
Heute Abend fehlt mir aber leider die Zeit, dir noch auf diverse Sprünge zu helfen...

Bemerken möchte ich allerdings, dass die DCF-Routine von rn-wissen.de eine Alternative zur DCF-Lib aus BASCOM darstellt.
Die DCF-Routine von rn-wissen wurde geschrieben, damit man auch einen anderen Timer für den DCF77 Empfang verwenden kann.
Dies ist mit der Standard-DCF-Lib aus BASCOM nämlich nicht möglich. ;)

Wenn du also den Timer1 sonst nicht zwingend benötigst, kannst du auch die Standard-Lib von BASCOM für den DCF77-Empfang verwenden.
Es spricht aber nichts dagegen die rn-wissen Routine einzusetzen. Ich verwende sie persönlich auch sehr gern.


Was deine Matrixansteuerung betrifft, da wäre in der Tat ein Schaltplan/Anschlussplan seeeeeehr hilfreich.

Grüße,
Cassio
 
Deine main läuft genau 1x pro Sekunde durch. Immer zur neuen Sekunde wird deshalb genau 1x in die sub gesprungen und die nur dann ausgeführt, wenn if dcfstatus.6=1 ist. Warum dieses if? Könnte sein, dass das genau deine sub immer überspringen lässt, weil neue Sekunde und dcfstatus.6 in Zusammenhang stehen.
 
Hallo Hydoxel!

Jetzt habe ich mal etwas mehr Zeit gehabt und habe mir deinen Code mal genauer angesehen.

Festgestellt habe ich nur drei Punkte und eine Frage. ;)

Wie Tschoeatsch schon geschrieben hat, fehlt natürlich der Punkt bei "Dcfstatus6"
Obendrein fehlt da noch ein "End IF".

Also hier:


CodeBox BascomAVR
Sub Showtime()

If Dcfstatus.6 = 1 Then
   _min = Minute
   _hour = Stunde
End If




Dann vermisse ich das Aktivieren der globalen Interrupts im Kopf des Programms.
Ich meine, dass du die wegen der Timer benötigst.

Trag das "Enable Interrupts" zum Beispiel hier ein:



CodeBox BascomAVR
Declare Sub Showtime()

Enable Interrupts

Dim I As Byte
Dim Minute As Word
Dim Min_ein As Word
Dim Stunde As Word
Dim Sekunde As Byte




Jetzt noch eine Frage zur DCF-soft.bas!
Hast du dort (und in der dcf77.lib) auch deinen PinA.0 als DCF-Eingang eingetragen?


Grüße,
Cassio
 
Zuletzt bearbeitet:
Hallo!

Wie ich eben gerade noch gesehen habe, wird das "Enable Interrupts" in der dcf77_Soft.bas gleich beim Starten des Timer2 mit ausgeführt.
Von daher musst du dies in deinem Programm natülich nicht noch einmal erwähnen.

Sorry, aber es ist schon einige Zeit her, dass ich mit der rn-wissen Routine gearbeitet habe. ;)


Grüße,
Cassio
 
Also erstmal danke an euch beiden, anbei werde ich mal ne Tabelle mit der Portbelegung anhängen. Schaltplan dauert noch etwas, muss mich erst in Fritzing und oder Eagle einarbeiten.
@Tschoeatsch
genau das meinte ich mit auf den Sprüngen helfen, bin ja auch hier um von euch zu lernen. Das ich durch die "Sekundenzählerei" die sub überspringe habe ich garnicht in betracht gezogen, die IF abfrage für den Status war eigentlich gedacht das er nur die Zeit stellt wenn das DFC signal plausibel ist, allerdings würde bei Empfangsstörungen dann ja nichts mehr angezeigt. Auch für diese Erkenntniss vielen Dank.

@ Cassio
Ja, den PIN hatteich bei beiden Dateien geändert.

Also mein nächster Schritt wird sein, erstmal die Softclock " nennt man sie so?" auszugeben und mich dann mit den Speichern und ausgeben der DCF Zeit zu kümmern. Ein kleiner Tipp wie ich damit starten könnte wäre ganz nett. :)
Werde die Main mal in Minute <> _min ändern, da ich ja eh keine Sekunden anzeigen möchte.

Danke Hydoxel

Aber vorerst muss ich mal eben um meine Jungs kümmern.
 

Anhänge

  • LED Uhr Rund.zip
    2,8 KB · Aufrufe: 7
Dcfstatus.6 liefert in der bascom-dcf-routine das Signal, was der Dcfempfänger ab gibt. Wenn du nur eine Anzeige bei gültiger Zeit haben willst, brauchst du dcfstatus.7. Aber auch wenn der Empfang mal gestört ist, läuft die Zeit quarzgenau weiter und wird beim nächsten gültigen Empfang wieder atomgenau. Übergebe in deiner sub einfach mal die Stunden und Minuten ohne eine if-Abfrage und schau mal, was angezeigt wird.
 
Danke für die Erklärung. Habe es jetzt so gemacht wie du sagtest Sekunde <> _sec in Minute umgeschrieben und siehe da, er spring in die sub und bleibt dort. Er zählt zwar noch nicht weiter, aber eins nach dem anderen. Ich habe gerade den LCD versuchsaufbau gemacht, und man mag es kaum glauben, hier bekomme ich nun kein Signal. DCF1 kaputt. DAs muss ich glaube ich erstmal überprüfen Vielleicht habe ich ihn ja auch geschrottet. Sobald ich mehr weiß berichte ich.

Danke Hydoxel
 
Dcfstatus.6 liefert in der bascom-dcf-routine das Signal, was der Dcfempfänger ab gibt.
Wenn du nur eine Anzeige bei gültiger Zeit haben willst, brauchst du dcfstatus.7.

Hallo!

Die Aussage stimmt aber nur bei der BASCOM-DCF Routine.

Bei der RN-WISSEN DCF-Routine haben die beiden Statusbits eine andere Bedeutung!




CodeBox BascomAVR
'Dcfstatus  -> Bit0: 15. Impuls erreicht  Bit4: 58 Impulse empfangen
'              Bit1: Minutenparität OK    Bit5: Gültiges DCF77-Telegramm
'              Bit2: Stundenparität OK    Bit6: Softclock nach DCF gestellt
'              Bit3: Parität OK           Bit7: DCF-Decoder EIN
'              ACHTUNG: Bits 0..5 NUR LESEN!!!



Grüße,
Cassio
 
@Cassio das wollte ich mit der Bezeichnung 'Bascom-dcf-routine' eigentlich ausdrücken, wobei mir das nicht geglückt ist. Ich hätte schreiben sollen : bei der bascom beigefügten Routine. Aber jetzt ist ja alles klar.
 
Hallo Tschoeatsch!

Ich habe das auch schon verstanden, darum habe ich ja auch geschrieben worfür es passt. ;)

Da aber Hydoxel mit der RN-WISSEN LIB arbeitet finde ich es ungünstig wenn man ihm erklärt, wie es bei anderen Routinen funktioniert.
Das hilft ihm bei seinem Programm nicht weiter und er hat auf meinen Hinweis, die BASCOM-Routine zu verwenden nicht reagiert.
Ergo gehe ich davon aus, dass er die RN-WISSEN Routine weiter verwendet.
Also sollten wir ihm auch nur Hilfe zu seinem Programm anbieten. :)

Er wird mit der Zeit schon dahinter kommen, dass er sein Programm noch trickreicher verbessern kann.....
aber darum geht es bei den ersten Schritten ja nicht. ;)
Hauptsache es macht Spaß, es stellen sich immer wieder Erfolgserlebnisse ein und es kommt sogar etwas sinnvolles bei raus. :good:

Grüße,
Cassio
 
Geschafft!

Nach vielen Stunden und Kaffee, hat es nun geklappt. Zum einen Lag es an einem Port dreher in der lib., also war der Hinweis von Casio mal wieder richtig. Danke dafür und zum anderen habe den Code vom r-n-wissen in der Sub so belassen und dafür dann meine Ausgabe eingeschrieben. Warum das nun klappt ist mir zwar noch etwas fraglich, aber das werde ich sicherlich zu einem spätern Zeitpunkt wenn ich mehr wissen habe genauer betrachten und auswerten können.
Das die BAscom Routine anders formatiert ist als die r.n.wissen ist mir aber tatsächlich aufgefallen, jedoch wollte ich gerne den Code von r-n wissen nehmen da die sync mit dem DCF sehr gut klappt.
Desweiteren aber noch etwas was ich mir nicht erklären kann, die ports D1 und D0 sprechen bei dem Code nicht an. Hatte auf D1 meine Zeile für die Minuten 31-39, jedoch wurde dieser port nicht angesteuert. Also mit einem Anderen code zum Test ausprobiert und es hat funktioniert. Da D0 noch frei war einfach mal schnell umgelötet und siehe da, es geht auch nicht. Naja B7 war auch frei und damit hat es dann geklappt. Habe mir die soft und die lib noch einmal genau angesehen und keinen Hinweis auf eine Portbelegung, ausser natürlich den Eingang für das Signal, gefunden. Also erstmal nicht drüber nachdenken und freuen das die Uhr nun läuft.
Den Code werde ich heute Abend auch noch einmal überarbeitet, sind noch nichtzutreffende Kommentare von Testen drin, hochladen.
@Cassio Ja es hat insgesamt sehr viel Spaß gemacht und ich werde sicherlich am Ball bleiben. Der Code ansich ist natürlich mit dem Holzhammer gemacht. :) Mit etwas Übung und Erfahrung werdes ich es dann wahrscheinlich in einen Index, und nicht mit so vielen If abfragen, schreiben und ein bisschen mit Tabellenschieberei arbeiten. Aber der Anfang ist gemacht und in diesem Sinne Danke ich euch das ihr mir Unterstützung gegeben habt.

Dank und Gruß Hydoxel
 
Hi,

Desweiteren aber noch etwas was ich mir nicht erklären kann, die ports D1 und D0 sprechen bei dem Code nicht an. Hatte auf D1 meine Zeile für die Minuten 31-39, jedoch wurde dieser port nicht angesteuert. Also mit einem Anderen code zum Test ausprobiert und es hat funktioniert. Da D0 noch frei war einfach mal schnell umgelötet und siehe da, es geht auch nicht.

Wenn man dein Programm ansieht ...

Code:
'###########################################################################
'Programmname: Decodertest.bas    Version 4.11
'
'Aufgabe:
'Es wird ein DCF-Empfänger (CONRAD 641138) an Portd.3 angeschlossen
'und DCF-Uhrzeit und -Datum auf dem LCD 4x16 ausgegeben.
'Dieses Programm ist ausgelegt für die Dcf77.lib ab V4.00.

'###########################################################################

$regfile = "m16adef.dat"                                    'ATmega 32
$crystal = 8000000                                          'Quarz: 8 MHz
$baud = 9600    '  #### Beim Mega16 ist PD0=RxD und PD1=TxD, also der UART für die Serielle ;-) ####
$hwstack = 32                                               'hardware stack
$swstack = 10                                               'software stack
$framesize = 40                                             'frame space

... und damit sind die beiden Pins auf die Sonderfunktion geschaltet und liegen nicht mehr auf dem normalen Register für PORTD :D Da hat BASCOM für dich mitgedacht. Wenn du eine Baudrate angibst, wirst du wohl auch irgendwo im Programm die Serielle Schnittstelle verwenden wollen. :p

Ich tippe mal wenn du es weg läßt, dann funktionieren die beiden Pins normal. ;)

Gruß
Dino
 
Hmm...
wirst du wohl auch irgendwo im Programm die Serielle Schnittstelle verwenden wollen
hab ich im vorliegenden Code beim überfliegen nicht gefunden...
Falls in einem Programm irgendwann mal der UART verwendet wird, dann initialisiert Bascom den für Dich am Anfang, und setzt auch die Beine auf die alternativen Funktionen. Die Baudrate wird aus der angegebenen $baud-Direktive errechnet, wurde keine angegeben gelten die Compiler Settings.
Wird der UART nie genutzt (kein Print/Input), initialisiert Bascom den UART nicht, die Beine bleiben I/Os, die Direktive ist wirkungslos.

Die baud-Instruktion hingegen erzeugt code/ändert den Wert der Baudratenregister. Allerdings ohne den UART ansonsten zu initialisieren. Damit kann die Baudrate zur Laufzeit geändert werden.

Achtung, stimmt teilweise nicht!!!
Richtigstellung hier.
 
Zuletzt bearbeitet:
Hi,

Die baud-Instruktion hingegen erzeugt code/ändert den Wert der Baudratenregister. Allerdings ohne den UART ansonsten zu initialisieren. Damit kann die Baudrate zur Laufzeit geändert werden.
... tja ... dann weiß ich auch nicht warum da die Pins nicht machen was sie sollen. Ich hab auf die Schnelle auch nichts anderes für den UART gefunden.
War die plausibelste Erklärung.

Gruß
Dino
 
Hallo Zusammen,

Dino hatte recht, ich habe die Baud raus genommen und Port D1 war wieder verfügbar, UART hatte ich nicht geplant. Hatte auch bei avrhelp bzgl baud etc. nachgelesen dort aber nichts gefunden. Deshalb ist es einfach gut hier zu sein. Danke dafür.
Werde nun noch den Code posten, wie schon geschrieben ist das für mich noch der Anfang und dieser Code bedarf bestimmt einer Überarbeitung. Aber im Moment bin ich einfach froh der er funktioniert.
Danke an alle die mich unterstützt haben.

Grüße Hydoxel

Code:
'###########################################################################
'Programmname: Decodertest.bas    Version 4.11
'
'Aufgabe:
'Es wird ein DCF-Empfänger (CONRAD 641138) an Portd.3 angeschlossen
'und DCF-Uhrzeit und -Datum auf dem LCD 4x16 ausgegeben.
'Dieses Programm ist ausgelegt für die Dcf77.lib ab V4.00.

'###########################################################################

$regfile = "m16adef.dat"                                    'ATmega 32
$crystal = 8000000                                          'Quarz: 8 MHz
$hwstack = 32                                               'hardware stack
$swstack = 10                                               'software stack
$framesize = 40                                             'frame space


$include "dcf77_soft.bas"


'###########################################################################
'Hauptprogramm:


Ddrd = &B11111111                                           ' D1-D6 Zeile einser Minten ; D7 Spalte 1 einser Minuten
Ddrc = &B11111111                                           ' C0 - C6 Spalten 2 - 7 einser Minuten; C7 Spalte 1 fünfer Minuten
Ddrb = &B11111111                                           ' B0 - B2 Spalten Stunden ; B3 - B6 Zeilen Stunden
Ddra = &B11111110                                           ' A1 - A2 Zeilen fünfer Minuten ; A3 - A7 Spalte 2 - 6 fünfer Minuten
                                                            ' A0 Eingang DCF

Portd = &B01111111
Portc = &B00000000
Portb = &B11111111
Porta = &B00000110

Declare Sub Showtime()


Dim I As Byte
Dim Minute As Word
Dim Stunde As Word
Dim Sekunde As Byte



'---------------------------------------------------------------------------

'Hauptprogramm:


'Time$ = "02:12:00"




I = 0
Sekunde = 0
Minute = 0

Dcfstatus.7 = 1                                                   'DCF-Decoder EIN

'****************** HAUPTPROGRAMMSCHLEIFE **********************************
'Testprogramm:
Do


  If Sekunde <> _sec Then

    Call Showtime()
    Sekunde = _sec
      Minute = _min
      Stunde = _hour
    End If





Loop

End

'************* ENDE HAUPTPROGRAMM ******************************************

Sub Showtime()



           If I = 0 Then I = 1 Else I = 0

  If Dcfstatus.6 = 1 Then
  Minute = _min
   If Minute = 1 Then
        Porta = &B00001010
        Portd = &B10111111 : Portc = &B00000000
        End If
        If Minute = 2 Then
        Portd = &B10111111 : Portc = &B00000001
        End If
        If Minute = 3 Then
        Portd = &B10111111 : Portc = &B00000011
        End If
        If Minute = 4 Then
        Portd = &B10111111 : Portc = &B00000111
        End If
         If Minute = 5 Then
        Porta = &B00000100
        Portc = &B10000111
        End If
         If Minute = 6 Then
        Portd = &B00111111 : Portc = &B10001000
        End If
         If Minute = 7 Then
        Portd = &B00111111 : Portc = &B10011000
        End If
          If Minute = 8 Then
        Portd = &B00111111 : Portc = &B10111000
        End If
        If Minute = 9 Then
        Portd = &B00111111 : Portc = &B11111000
        End If
        If Minute = 10 Then
        Porta = &B10000100
        End If
          If Minute = 11 Then
        Portd = &B11011111 : Portc = &B10000000
        End If
        If Minute = 12 Then
        Portd = &B11011111 : Portc = &B10000001
        End If
        If Minute = 13 Then
        Portd = &B11011111 : Portc = &B10000011
        End If
        If Minute = 14 Then
        Portd = &B11011111 : Portc = &B10000111
        End If
         If Minute = 15 Then
        Porta = &B11000100
        End If
         If Minute = 16 Then
        Portd = &B01011111 : Portc = &B10001000
        End If
         If Minute = 17 Then
        Portd = &B01011111 : Portc = &B10011000
        End If
          If Minute = 18 Then
        Portd = &B01011111 : Portc = &B10111000
        End If
        If Minute = 19 Then
        Portd = &B01011111 : Portc = &B11111000
        End If
        If Minute = 20 Then
        Porta = &B11100100
        End If
        If Minute = 21 Then
        Portd = &B11101111 : Portc = &B10000000
        End If
        If Minute = 22 Then
        Portd = &B11101111 : Portc = &B10000001
        End If
        If Minute = 23 Then
        Portd = &B11101111 : Portc = &B10000011
        End If
        If Minute = 24 Then
        Portd = &B11101111 : Portc = &B10000111
        End If
        If Minute = 25 Then
        Porta = &B11110100
        End If
        If Minute = 26 Then
        Portd = &B01101111 : Portc = &B10001000
        End If
        If Minute = 27 Then
        Portd = &B01101111 : Portc = &B10011000
        End If
        If Minute = 28 Then
        Portd = &B01101111 : Portc = &B10111000
        End If
        If Minute = 29 Then
        Portd = &B01101111 : Portc = &B11111000
        End If
        If Minute = 30 Then
        Porta = &B11111100
        End If
        If Minute = 31 Then
        Portd = &B11111101 : Portc = &B10000000
        End If
        If Minute = 32 Then
        Portd = &B11111101 : Portc = &B10000001
        End If
        If Minute = 33 Then
        Portd = &B11111101 : Portc = &B10000011
        End If
        If Minute = 34 Then
        Portd = &B11111101 : Portc = &B10000111
        End If
        If Minute = 35 Then
        Porta = &B00000010
        End If
        If Minute = 36 Then
        Portd = &B01111100 : Portc = &B10001000
        End If
        If Minute = 37 Then
        Portd = &B01111100 : Portc = &B10011000
        End If
        If Minute = 38 Then
        Portd = &B01111100 : Portc = &B10111000
        End If
        If Minute = 39 Then
        Portc = &B11111100 : Portc = &B11111000
        End If
        If Minute = 40 Then
        Porta = &B10000010
        End If
        If Minute = 41 Then
        Portd = &B11111011 : Portc = &B10000000
        End If
        If Minute = 42 Then
        Portd = &B11111011 : Portc = &B10000001
        End If
        If Minute = 43 Then
        Portd = &B11111011 : Portc = &B10000011
        End If
        If Minute = 44 Then
        Portd = &B11111011 : Portc = &B10000111
        End If
        If Minute = 45 Then
        Porta = &B11000010
        End If
        If Minute = 46 Then
        Portd = &B01111011 : Portc = &B10001000
        End If
        If Minute = 47 Then
        Portc = &B01111011 : Portc = &B10011000
        End If
        If Minute = 48 Then
        Portd = &B01111011 : Portc = &B10111000
        End If
        If Minute = 49 Then
        Portd = &B01111011 : Portc = &B11111000
        End If
        If Minute = 50 Then
        Porta = &B11100010
        End If
        If Minute = 51 Then
        Portd = &B11110111 : Portc = &B10000000
        End If
          If Minute = 52 Then
        Portd = &B11110111 : Portc = &B10000001
        End If
        If Minute = 53 Then
        Portc = &B11110111 : Portc = &B10000011
        End If
        If Minute = 54 Then
        Portd = &B11110111 : Portc = &B10000111
        End If
        If Minute = 55 Then
        Porta = &B11110010
        End If
        If Minute = 56 Then
        Portd = &B01110111 : Portc = &B10001000
        End If
        If Minute = 57 Then
        Portd = &B01110111 : Portc = &B10011000
        End If
        If Minute = 58 Then
        Portd = &B01110111 : Portc = &B10111000
        End If
        If Minute = 59 Then
        Portd = &B01110111 : Portc = &B11111000
        End If
        If Minute = 0 Then
        Porta = &B11111010
        End If



        Stunde = _hour
        If Stunde > 12 Then
         Stunde = Stunde - 12
      End If

      If Stunde = 0 Then Stunde = 12

          If Stunde = 3 Then
       Portb.0 = 0
       Portb.1 = 0                                            ' Spalte 1 = B2 .... Spalte 3 = B0   1 = aktive
       Portb.2 = 1                                             ' Zeile 1 = B6 ... Zeile 4 = B3 0 =aktive
       Portb.3 = 1
       Portb.4 = 1
       Portb.5 = 1
       Portb.6 = 0
       End If
       If Stunde = 1 Then
       Portb.0 = 1
       Portb.1 = 0
       Portb.2 = 0
       Portb.3 = 1
       Portb.4 = 1
       Portb.5 = 1
       Portb.6 = 0
       End If
       If Stunde = 2 Then
       Portb.0 = 0
       Portb.1 = 1
       Portb.2 = 0
       Portb.3 = 1
       Portb.4 = 1
       Portb.5 = 1
       Portb.6 = 0
       End If
       If Stunde = 3 Then
       Portb.0 = 0
       Portb.1 = 0
       Portb.2 = 1
       Portb.3 = 1
       Portb.4 = 1
       Portb.5 = 1
       Portb.6 = 0

       End If
       If Stunde = 4 Then
       Portb.0 = 0
       Portb.1 = 0
       Portb.2 = 1
       Portb.3 = 1
       Portb.4 = 1
       Portb.5 = 0
       Portb.6 = 1
       End If
       If Stunde = 5 Then
       Portb.0 = 0
       Portb.1 = 1
       Portb.2 = 0
       Portb.3 = 1
       Portb.4 = 1
       Portb.5 = 0
       Portb.6 = 1
       End If
       If Stunde = 6 Then
       Portb.0 = 1
       Portb.1 = 0
       Portb.2 = 0
       Portb.3 = 1
       Portb.4 = 1
       Portb.5 = 0
       Portb.6 = 1
       End If
       If Stunde = 7 Then
       Portb.0 = 0
       Portb.1 = 0
       Portb.2 = 1
       Portb.3 = 1
       Portb.4 = 0
       Portb.5 = 1
       Portb.6 = 1
       End If
       If Stunde = 8 Then
       Portb.0 = 0
       Portb.1 = 1
       Portb.2 = 0
       Portb.3 = 1
       Portb.4 = 0
       Portb.5 = 1
       Portb.6 = 1
       End If
       If Stunde = 9 Then
       Portb.0 = 1
       Portb.1 = 0
       Portb.2 = 0
       Portb.3 = 1
       Portb.4 = 0
       Portb.5 = 1
       Portb.6 = 1
       End If
       If Stunde = 10 Then
       Portb.0 = 0
       Portb.1 = 0
       Portb.2 = 1
       Portb.3 = 0
       Portb.4 = 1
       Portb.5 = 1
       Portb.6 = 1
       End If
       If Stunde = 11 Then
       Portb.0 = 0
       Portb.1 = 1
       Portb.2 = 0
       Portb.3 = 0
       Portb.4 = 1
       Portb.5 = 1
       Portb.6 = 1
       End If
       If Stunde = 12 Then
       Portb.0 = 1
       Portb.1 = 0
       Portb.2 = 0
       Portb.3 = 0
       Portb.4 = 1
       Portb.5 = 1
       Portb.6 = 1

       End If
                Elseif Dcfstatus.7 = 1 And I = 0 Then
                Portd.0 = 0 : Portd.7 = 1
  Else
        Portd.0 = 1 : Portd.7 = 1



      End If

End Sub

'************* ENDE HAUPTPROGRAMM ******************************************

'---------------------------------------------------------------------------

Getdatetime:                                                'Nicht genutzt!
Setdate:
Settime:
Return
'---------------------- Interrupt Routine DCF77 ----------------------------

Tim2_isr:
  Timer2 = Startwert
  Call Dcf77_soft
Return
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)