Stoppuhr für Feuerwehr

Hier der Code:
Bitte berücksichtigen, dass es mein erstes Programm mit Bascom und auch mit einem µC ist ;)

Code:
'---------------------------------------
'DAS IST MEIN ERSTES TESTPROGRAMM MIT BASCOM

'Autor: Karl Weber
'Titel: Testprogramm.bas
'Datum: 12. Mai 2008
'---------------------------------------

$regfile = "m8def.dat"
$crystal = 8000000                                          'Oszillator 8 MHz


Config Lcd = 16 * 2                                         'LCD Display mit 2x 16 Zeichen
Config Pinb.0 = Input                                       'Portpin B 0 = Start
Config Pinb.1 = Input                                       'Portpin B 1 = Stop
Config Pinb.2 = Input                                       'Portpin B 2 = Reset
Config Pinb.3 = Input

Portb = 255                                                 'Pullup



'Variablendeklaration

Const Reload = 78                                           'Preload-Wert für Timer0 (10ms Interrupt)
Dim Hs As Word                                              'Variable für Hundertstel Sekunden
Dim S As Integer                                            'Variable für Sekunden
Dim Go As Integer
Dim Loopcnt As Integer                                      'Variable zum Zähler der Haupt-Schleifen-Durchläufe

'Initialisierung

Hs = 0
S = 0
Go = 0
Loopcnt = 0


Config Timer0 = Timer , Prescale = 1024                     'Timer 0 mit Prescaler 1024 (32,768ms)

   Stop Timer0                                              'Timer0 wird standardmäßig gestoppt

   On Timer0 Timer0_isr                                     'Sprung Timer0 Interrupt Serviceroutine

   Enable Timer0                                            'Timer aktivieren
   Enable Interrupts                                        'Interrupts aktivieren

                                                             'LCD Löschen
   Cls                                                      'Cursor verbergen
   Cursor Off Noblink                                       'Ausgabe auf obere Zeile LCD
   Upperline                                                'Statischer Text
   Lcd "   FEUERWEHR"                                       'Ausgabe auf untere Zeile
   Lowerline                                                'Statischer Text
   Lcd "GR.HARTMANNSDORF"                                   '1 Sekunde warten
   Waitms 2000

   Cls                                                      'LCD löschen
   Upperline                                                'Ausgabe auf obere Zeile
   Lcd "   Kuppelcup"                                       'Statischer Text
   Lowerline                                                'Ausgabe auf untere Zeile
   Lcd "  Stop-System"                                      'Statischer Text

   Waitms 2000                                              '1 Sekunde warten
   Cls                                                      'LCD löschen



Do                                                          'Beginn Main-Loop
   Upperline                                                'Ausgabe obere Zeile
   If Pinb.0 = 0 Then                                       'Starte Timer0 (Taste Start)
      Start Timer0
   End If

   If Pinb.1 = 0 Then                                       'Stoppe Timer0 (Taste Stop)
      Stop Timer0
   End If

   If Pinb.2 = 0 Then                                       'Reset Stoppe Timer, falls nicht gestoppt und 00:00 ausgeben
      Stop Timer0                                           'Timer stoppen
      Tcnt0 = 0                                             'Timer auf 0-setzten
      S = 0
      Hs = 0
   End If

   If Pinb.3 = 0 Then                                       'Lösche LCD.... (nur für Tests)
      Cls
      Tcnt0 = 0
   End If

   Lcd Hs

   Incr Loopcnt                                             'Inkrementierung des Main-Loop Zählers

   Lowerline
   Lcd Timer0
   Locate 1 , 10
   Lcd Loopcnt

Loop                                                        'Ende Main-Loop

End

Timer0_isr:                                                 'Interrupt Routine

   Load Timer0 , Reload                                     'Timer0 mit Preload-Wert laden
   Incr Hs                                                  'Hundertstel incrementieren
   Loopcnt = 0                                              'Mainloop-Zähler wieder zurücksetzen
Return                                                      'Rücksprung ins Main-Programm

LG
Karl
 
Hallo Karl,

die Display-Ausgabe in der do-loop Schleife benötigt relativ viel Zeit. Dauert die länger als 10ms, wird Loopcnt durch die Timer0 ISR wieder zurückgesetzt, bevor Loopcnt auf dem Display ausgegeben wird.
Code:
   Lowerline
   Lcd Timer0
   Locate 1 , 10
   Lcd Loopcnt
Es erfolgt auch dann eine Datenübertragung zum Display, wenn der Timer0 nicht läuft. Das belastet den Mikrocontroller schätzungsweise zu 95% oder eher sogar mehr. Es ist zwar normalerweise egal, ob er durch eine Displayausgabe belastet wird oder durch eine auf ein Ereignis wartende Schleife, die Displayausgabe dauert aber länger und auf der Schnittstelle zum Display hast du hier permanent ändernde Signalpegel (EMV-problematisch), das ist hier zwar nicht so kritisch, aber man sollte es trotzdem vermeiden. Es ist besser die Rechenzeit zum Beispiel für die Abfrage der Tasten zu verwenden.

Ich würde die Daten nur dann zum Display senden, wenn die Stoppuhr wirklich läuft oder einmalig, wenn eine Taste (Stopp oder Null-setzen) betätigt wird. Dann würde ich die Ausgabe noch verzögert zu definierten Zeitpunkten durchführen, vielleicht alle 50ms. Um schnell auf die Stopp-Taste reagieren zu können, kannst du die Taste auch in der ISR vom Timer0 abfragen und bei gedrückter Taste dort den Timer0 deaktivieren.

Wenn die Stoppuhr mit dem alphanumerischen Display richtig läuft, würde ich die Schnittstelle zu den Display-Modulen programmieren (habe ich mir noch nicht angesehen, mache ich aber noch)

Vielleicht konnten dir die Tipps ein bisschen weiterhelfen oder dich auf Ideen bringen (übrigends habe ich auch noch nicht in Bascom programmiert, weiss also nicht, ob es fertige interessante Features gibt, die du hier gut einsetzen kannst)

Grüße,
Dirk

Noch ein kleiner Hinweis:
Mit einem Reload-Wert von 78 und einem Prescaler von 1024 erreichst du mit dem Timer nicht genau eine Überlaufzeit von 10ms. Das kannst du auch mal mit dem kleinen Programmtool AVR-Timer-Calculator überprüfen. Dies dürfte aber hier nicht weiter tragisch sein. (Wahrscheinlich ist es dir bei der Berechnung des Reload-Wertes selber aufgefallen)
 
Ich verstehe da so einiges nicht so ganz von...

Zum einen müsstest du das Display wohl nach dem Config lcd erstmal initialisieren - war zumindest bei mir bisher immer notwendig.

Warum nimmt du denn für hundertstel und Sekunden so riesige Variablen? es reicht doch für beide Werte jeweils ein Byte? (Byte = 0 bis 255)

Dass das mit dem Display suboptimal ist, hat Dirk ja bereits geschrieben - zum einen wegen der Auslastung und zum anderen wirst du sie kaum lesen können - weil das Display eine Trägheit besitzt.
Ich würde parallel zum eigentlichen Hundertstelzähler eine Variable mitzählen, die dann in der Mainloop auf ab einem bestimmten Wert eine Displayausgabe auslöst und dann zurückgesetzt wird. damit kannst ud auch die Aktualisierungsrate bestimmen - gegen Flackern.

Wie setzt du denn die HS-Sekunden zurück und increast die Sekunden? Irgendwie scheinen mir da noch Teile zu fehlen - oder hab ich jetzt was nciht geblickt?

Gruß Rainer
 
Hi,

danke für die vielen Antworten.

Im Moment zähle ich nur Hs rauf, weil das mit der Ausgabe auf das Display noch nicht ganz so schön funktioniert hat. Da muss ich mir noch mehr gedanken drüber machen.

Also was ich jetzt aus euren Beitragen rausgelesen hab ist, dass die Ausgabe auf das Display viel Resourcen frisst und somit so selten wie möglich gemacht werden sollte. Also ich würde sagen so mit 20 Hz sollte gut hinhaun.

Das mit den Datentypen... korrekt. Da hab ich die falschen drinnen... ist wohl noch eine blöde Angewohnheit von anderen Sprachen.

Ich werd den Code jetzt mal abändern und euch dann die Ergebnisse wieder zeigen...

Ich bin aber sehr froh, dass ich sehr schnell (durch euren Buchtip) zu einem Ergebnis gekommen bin :) Macht schon richtig Spaß!

LG
Karl
 
Hi,

danke für die vielen Antworten.

Im Moment zähle ich nur Hs rauf, weil das mit der Ausgabe auf das Display noch nicht ganz so schön funktioniert hat. Da muss ich mir noch mehr gedanken drüber machen.

Das liegt vermutlich an der hohen Wiederholrate - das funktioniert einfach nciht vernünftig.

Also was ich jetzt aus euren Beitragen rausgelesen hab ist, dass die Ausgabe auf das Display viel Resourcen frisst und somit so selten wie möglich gemacht werden sollte. Also ich würde sagen so mit 20 Hz sollte gut hinhaun.

Ich würde es noch seltener machen. Machs einmal die Sekunde - immer dann, wenn sie sich ändert. Und erst wenn auf Stopp gedrückt wird würde ich die hundertstel anhängen - spart enorm viel Rechenzeit und man kann noch viel weiteres auf diese Art dann reinbringen. Außerdem bist du flimmern damit von vornerherein los.

Das mit den Datentypen... korrekt. Da hab ich die falschen drinnen... ist wohl noch eine blöde Angewohnheit von anderen Sprachen.

Wo auch immer du dir das so angeeignet hast - das ist eine ganz ganz schlechte Angewohnheit. Normalerweise lernt man, so effektiv wie möglich zu Programmieren - dass das nich immer geht, ist mir schon klar - aber gerade bei Speicherplatzarmen Dingen wie so einem µC ist es halt imho noch wichtiger.

Ich werd den Code jetzt mal abändern und euch dann die Ergebnisse wieder zeigen...

Ich bin aber sehr froh, dass ich sehr schnell (durch euren Buchtip) zu einem Ergebnis gekommen bin :) Macht schon richtig Spaß!

LG
Karl

Für die schnellen Einstiegserfolge ist BASCOM auch nicht verkehrt - man kann es sich im Prinzip mit seinen Englisch-kenntnissen aneignen. Ich werde es aber auch nciht mehr hergeben, auch wenn andere sagen, es wäre Schrott...

Gruß Rainer
 
Hi,

jetzt hab ich mir das Tool runtergeladen und den Prescale Wert berechnet. Ich hab jetzt mal den externen Quartz mit 3,6864 MHz aktiviert und versuchs mit dem. Nur ist jetzt das Problem, dass er viel zu schnell zählt, obwohl ich der Meinung bin, alles richtig gemacht zu haben. Findet ihr einen Fehler?

Danke LG
Karl

Code:
'---------------------------------------
'DAS IST MEIN ERSTES TESTPROGRAMM MIT BASCOM

'Autor: Karl Weber
'Titel: Testprogramm.bas
'Datum: 12. Mai 2008
'---------------------------------------

$regfile = "m8def.dat"
$crystal = 3686400                                          'Oszillator 3,6864 MHz


Config Lcd = 16 * 2                                         'LCD Display mit 2x 16 Zeichen
Config Pinb.0 = Input                                       'Portpin B 0 = Start
Config Pinb.1 = Input                                       'Portpin B 1 = Stop
Config Pinb.2 = Input                                       'Portpin B 2 = Reset
Config Pinb.3 = Input

Portb = 255                                                 'Pullup



'Variablendeklaration

Const Reload = 18                                           'Preload-Wert für Timer0 (10ms Interrupt)
Dim Hs As Byte                                              'Variable für Hundertstel Sekunden
Dim Zs As Byte                                              'Variable für Zehntel Sekunden
Dim S1 As Byte                                              'Variable für Sekundenwert 1
Dim S2 As Byte                                              'Variable für Sekundenwert 2
Dim Go As Byte                                              'Variable für "Läuft"
Dim Loopcnt As Byte                                         'Variable zum Zähler der Haupt-Schleifen-Durchläufe

'Initialisierung

Hs = 0
Zs = 0
S1 = 0
S2 = 0
Go = 0
Loopcnt = 0


Config Timer0 = Timer , Prescale = 1024                     'Timer 0 mit Prescaler 128

   Stop Timer0                                              'Timer0 wird standardmäßig gestoppt

   On Timer0 Timer0_isr                                     'Sprung Timer0 Interrupt Serviceroutine

   Enable Timer0                                            'Timer aktivieren
   Enable Interrupts                                        'Interrupts aktivieren

                                                             'LCD Löschen
   Cls                                                      'Cursor verbergen
   Cursor Off Noblink                                       'Ausgabe auf obere Zeile LCD
   Upperline                                                'Statischer Text
   Lcd "   FEUERWEHR"                                       'Ausgabe auf untere Zeile
   Lowerline                                                'Statischer Text
   Lcd "GR.HARTMANNSDORF"                                   '1 Sekunde warten
   Waitms 2000

   Cls                                                      'LCD löschen
   Upperline                                                'Ausgabe auf obere Zeile
   Lcd "   Kuppelcup"                                       'Statischer Text
   Lowerline                                                'Ausgabe auf untere Zeile
   Lcd "  Stop-System"                                      'Statischer Text

   Waitms 2000                                              '1 Sekunde warten
   Cls                                                      'LCD löschen



Do                                                          'Beginn Main-Loop
   Upperline                                                'Ausgabe obere Zeile
   If Pinb.0 = 0 Then                                       'Starte Timer0 (Taste Start)
      Start Timer0
      Go = 1
   End If

   If Pinb.1 = 0 Then                                       'Stoppe Timer0 (Taste Stop)
      Stop Timer0
      Go = 0
   End If

   If Pinb.2 = 0 Then                                       'Reset Stoppe Timer, falls nicht gestoppt und 00:00 ausgeben
      Stop Timer0                                           'Timer stoppen
      Tcnt0 = 0                                             'Timer auf 0-setzten
      S1 = 0
      S2 = 0
      Hs = 0
      Zs = 0
      Go = 0
   End If

   If Pinb.3 = 0 Then                                       'Lösche LCD.... (nur für Tests)
      Cls
      Tcnt0 = 0
   End If

   If Go = 1 Then                                           'Wenn "Go"-Variable gesetzt wurde, Zählt die Uhr



      If Hs > 9 Then
         Incr Zs
         Hs = 0

         If Zs > 9 Then
            Incr S1
            Zs = 0

            If S1 > 9 Then
               Incr S2
               S1 = 0

               If S2 > 9 Then
                  Hs = 0
                  Zs = 0
                  S1 = 0
                  S2 = 0
                  Cls
               End If

            End If

         End If

      End If

   If Hs = 0 Then                                           'Alle 100 ms wird das Display Aktualisiert

      Locate 1 , 1
      Lcd S2
      Locate 1 , 2
      Lcd S1
      Locate 1 , 3
      Lcd ":"
      Locate 1 , 4
      Lcd Zs

   End If


   Else                                                     'Wenn Uhr gestoppt wurde, wird im Zyklus das Display aktualisiert... wird noch ausgebessert wenn mal alles funzt


   Locate 1 , 1
   Lcd S2
   Locate 1 , 2
   Lcd S1
   Locate 1 , 3
   Lcd ":"
   Locate 1 , 4
   Lcd Zs
   Locate 1 , 5
   Lcd Hs

   End If


   Incr Loopcnt                                             'Inkrementierung des Main-Loop Zählers

  ' Locate 1 , 10
  ' Lcd Loopcnt

Loop                                                        'Ende Main-Loop

End

Timer0_isr:                                                 'Interrupt Routine

   Load Timer0 , Reload                                     'Timer0 mit Preload-Wert laden
   Incr Hs                                                  'Hundertstel incrementieren
Return                                                      'Rücksprung ins Main-Programm
 
Hi,

jetzt hab ich mir das Tool runtergeladen und den Prescale Wert berechnet. Ich hab jetzt mal den externen Quartz mit 3,6864 MHz aktiviert und versuchs mit dem. Nur ist jetzt das Problem, dass er viel zu schnell zählt, obwohl ich der Meinung bin, alles richtig gemacht zu haben. Findet ihr einen Fehler?

Hallo Karl,

Für den Prescaler 1024 benötigst du einen Reload-Wert von 220.


Edit: Habe gerade gesehen, dass in dem Calculator ja noch ein Fehler drin ist. Der Reloadwert muss 256-36 sein, also 220! 36 ist der angezeigte Wert. Habe gerade keine Zeit, ich sehe mir das heute Abend mal an.

Edit2: Calculator geändert (aktuell REV1.1)

Grüße,
Dirk
 

Anhänge

  • timer0_prescaler1024.png
    timer0_prescaler1024.png
    19,4 KB · Aufrufe: 19
Hi Dirk,

36 ist schon richtig! Kommt auch raus wenn ichs mit der Hand nachrechne bzw. es funktioniert jetzt auch auf dem Board!

Also so mit 10 Hz aktualisierung und dem externen Quarz sieht die Sache schon ganz anders aus, da reicht jetzt auch 3,6864 MHz aus und geht jetzt endlich sehr sehr genau. Jetzt gehts dann ans übertrage der Daten zum Display!

Danke, LG
Karl
 
Hallo zusammen,

zur Ergänzung ein paar Daten zum Spielen bzw. zur Bestätigung:

Quarz 3,6864 MHz, Interruptfrequenz 100 Hz da Auflösung 1 msec.

Daten für einen 8-Bit-Timer:
Prescaler 256
Reloadwert 112
Genaueste mögliche Frequenz: 100
Interrupt erfolgt im Abstand von 10.000 µsec

Daten für einen 16-Bit Timer:
Prescaler 1
Reloadwert 28672
Genaueste mögliche Frequenz: 100
Interrupt erfolgt im Abstand von 10.000 µsec

Grüße,
Markus
 
Hallo Karl,

in dem Berechnungstool ist leider Compare-Wert und Reload-Wert in der Tabelle vertauscht (ändere ich heute abend)

Für den 8Bit-Timer kannst du zum Beispiel die folgenden Werte nehmen:

Prescaler 256, Reloadwert 112 (siehe Beitrag von Markus)
Prescaler 1024, Reloadwert 220

Edit: Timer-Calculator ist verbessert. Im Anhang sieht man alle möglichen Reloadwerte für einen 8Bit-Timer und einen 16Bit-Timer bei einer Frequenz von 3,686400MHz und einer Interrupt-Zeit von 10ms. (Bemerkung: Nicht alle Timer besitzen alle Prescaler)

Grüße,
Dirk
 

Anhänge

  • timer0_reload_8bit.png
    timer0_reload_8bit.png
    19,1 KB · Aufrufe: 16
  • timer0_reload_16bit.png
    timer0_reload_16bit.png
    19,6 KB · Aufrufe: 15
Hi,

ja das haut so jetzt hin. Die Uhr läuft jetzt sehr genau.

Jetzt kommt das Übel mit den Dispays, da brauch ich mal euren Rat. Hab mir schon den Kopf zerbrochen wie ich das angehen kann.
Im Datenblatt steht ja drinnen, das die Taktfrequenz nicht mehr als 1 MHz sein darf. Also muss ich mir überlegen wie ich einen Takt erzeugen kann an einem Ausgang, und wie ich dann die Datenbytes synchron drüber bring.... Hat jemand eine Idee?

LG
Karl
 
Hallo Karl,

du definierst einfach zwei Portpins als Ausgänge (Clk, Data). Dein AVR wird an die Stiftleiste J3 des ersten Displays angeschlossen, weitere Displays kannst du seriell anschließen, immer von J4 (Ausgang) an J3 (Eingang). Den PWM-Eingang vom ersten Display schließt du erst einmal an +5V an (hier könntest du später ggf über einen PWM-Ausgang des AVR die Helligkeit einstellen)

Jedes Display benötigt ein Byte zur Darstellung, das heisst, wenn du zum Beispiel 3 Displays angeschlossen hast, musst du 3 Bytes seriell raustakten.

Ein Enable- oder Latch-Signal was man zum synchronisieren verwenden kann gibt es nicht. Wenn du zu wenig oder zu viele Bits überträgst oder wenn du nicht synchron überträgst, wird wahrschinlich etwas falsches angezeigt. Synchron ist das System nach dem Reset.

Bei einer steigenden Flange des Clk-Signals übernimmt das Display das Bit am Data-In Pin.

Ich würde erst ein Display anschließen, ein definiertes Byte übertragen und das Ergebnis mit dem zu erwartenden Wert aus der Tabelle auf der letzten Seite des Datenblatts vom Display vergleichen. Wenn das funktioniert, dann weitere Display anschließen und entsprechend mehrere Bytes übertragen, funktioniert das wiederum, würde ich mir über die Dekodierung (zB. über eine Tabellenaddressierung, je nach Komplexität) gedanken machen.

Wie man nun Portpins als Ausgang definiert, Bytes seriell in Verbindung mit einem Clock-Signal manuell raustaktet und dabei eine kleine Verzögerung einbaut, kannst du an folgendem Beispiel von Markus sehr schön sehen.


Grüße,
Dirk

Zugehöriger Beitrag: http://www.avr-praxis.de/forum/showthread.php?t=52&page=3

Code:
$regfile = "m8def.dat"
$crystal = 1000000

' Ressourcen festlegen
Dlen Alias Portb.0                                          'Dlen Leitung = Portb.0  'Anschluss 13
Clb Alias Portb.1                                           'Clock Leitung = Portb.1  'Anschluss 14
Dat Alias Portb.2                                           'Data Leitung = Portb.2   'Anschluss 12

' Wartezeit zwischen dem einzelnen Bitgezappel global festlegen
Bit_wait_time Alias 10

' Globale Variable definieren
Dim Temp_byte_1 As Byte

Dim Worda_frequency As Word
Worda_frequency = 16000

Dim Wordb_config As Word
Wordb_config = &H8150


' Prototypen definieren
Declare Sub Write_word_to_saa(byval Value As Word)

' Alle Anschlussleitungen als Ausgang konfigurieren
Config Dat = Output
Config Dlen = Output
Config Clb = Output

' Zuerst warten wir mal ein bissle
Waitms 100

' Erstmal Ruhe auf dem Datenbus
Reset Dlen
Reset Clb
Reset Dat

' Jetzt toggeln wir mal ein bisschen
For Temp_byte_1 = 1 To 16                                   ' zur Sicherheit 16 mal, das ist gut!
   Set Clb
   Waitus Bit_wait_time
   Reset Clb
   Waitus Bit_wait_time
Next Temp_byte_1

Call Write_word_to_saa(wordb_config)
Call Write_word_to_saa(worda_frequency)

' Hauptschleife
Do
   ' Tue nix
Loop

' Subroutine zum schreiben eines Word zum SAA
Sub Write_word_to_saa(byval Value As Word)

   ' lokale Variablen
   Local Countervalue As Byte
   Local Tempvalue As Byte

   ' Für Busruhe sorgen
   Reset Dlen
   Reset Clb
   Reset Dat
   Waitus Bit_wait_time

   ' Und los gehts, raus mit dem ersten Low-Bit (Startbit)
   Set Dlen
   Waitus Bit_wait_time

   Set Clb
   Waitus Bit_wait_time

   Reset Clb
   Waitus Bit_wait_time

   ' Und nun die Bits aus dem übergebenen Word rausschaufeln
   For Countervalue = 0 To 15
      ' Bit prozessieren und anlegen
      Rotate Value , Left , 1
      Tempvalue = Value And 1
      If Tempvalue = 0 Then
         Reset Dat
      Else
         Set Dat
      End If
      Waitus Bit_wait_time

      ' Takt erzeugen
      Set Clb
      Waitus Bit_wait_time

      Reset Clb
      Waitus Bit_wait_time

   Next A

   ' Daten Endsequenz senden

   Reset Dlen
   Waitus Bit_wait_time

   Set Clb
   Waitus Bit_wait_time

   Reset Clb
   Waitus Bit_wait_time

   Set Dlen
   Reset Dat
   Reset Clb
   Waitms 100

End Sub


End
 
Danke,

jetzt mal wieder eine wahrscheinlich "dumme" Anfängerfrage. Wenn ich jetzt meine 4 Displays in Serie schalte... woher wissen die Displays das die Daten für sie sind und nicht fürs nächste oder sonst irgend eines.
Ich wollts ja gleich so machen, dass ich einen Takt generier, den dann auf alle Displays aufschalte, und dann 4 seperate Portpins (die ja noch zur Verfügung stehen) verwenden; für jedes Display eins.

Wenn das mal geht, dann befass ich mich mit der von dir genannten Tabelle..
Is doch ein schönes Stück arbeit, wie ich jetzt merke :)

Thx,
LG
Karl
 
Hallo Karl,
Wenn ich jetzt meine 4 Displays in Serie schalte... woher wissen die Displays das die Daten für sie sind und nicht fürs nächste oder sonst irgend eines.

sind die Displays alle seriell angeschlossen, überträgst du 4 Byte, das erste Byte, welches du übertägst, ist für das letzte Display, das letzte übertragene Byte ist für das erste, was am AVR angeschlossen ist.


Ich wollts ja gleich so machen, dass ich einen Takt generier, den dann auf alle Displays aufschalte, und dann 4 seperate Portpins (die ja noch zur Verfügung stehen) verwenden; für jedes Display eins.
... kannst du machen, würde ich aber nicht. Takt und Daten werden von einem Display zum anderen übergeben. Du kannst somit die Daten über nur zwei Signal-Leitungen zu allen Displays übertragen.

Grüße,
Dirk
 
Im Prinzip würde ich sie auch alle hintereinanderschalten... Allerdings würde ich hier sagen, dass es abhängig ist davon, wie er anzeigen will.. Es handelt sich ja offenbar um eine Schieberegister-Technik.

Wenn er nämlich jede 100stel Sekunde anzeigen will, dann wird das viel aufwand (man müsste sehen, wie das zeitlich dann hinhaut) - und vor allem könnte es sein (hab das Datenblatt mal nur überflogen) dass Display während des Datenschiebens flimmert... Oder du musst eben die PWM während des Schiebens auslassen.

OT: Wo gibt es denn eigentlich diese Displays? Ich Entwickel da grad ne ähnliche Idee

Gruß Rainer
 
Hallo Rainer,
...Es handelt sich ja offenbar um eine Schieberegister-Technik.

Wenn er nämlich jede 100stel Sekunde anzeigen will, dann wird das viel aufwand (man müsste sehen, wie das zeitlich dann hinhaut) - und vor allem könnte es sein (hab das Datenblatt mal nur überflogen) dass Display während des Datenschiebens flimmert... Oder du musst eben die PWM während des Schiebens auslassen.
ich schätze, dass man für die Übertragung der 4 Bytes grob 40us bis 80us benötigt (einschließlich der Pausen um max. Übertragungsrate einzuhalten, glaube der Grenzwert war hier 1us?!). Die Anzeigen werden während der Übertragung 3mal einen falschen Wert anzeigen (könnte aber auch sein, bei jedem übertragenen Bit, das liegt an der Software im Pic auf den Anzeigen). Wenn man hier sehr oft die Anzeige updated, wird man dieses sehen. Ich würde nicht öfter als alle 50ms updaten. Eine gute Idee von dir ist auch, wenn man das PWM signal während der Übertragung auf low setzt, ich vermute aber, dass dies garnicht notwendig ist.


OT: Wo gibt es denn eigentlich diese Displays? Ich Entwickel da grad ne ähnliche Idee
Musst mal vorne im Thread schauen, dort hat Karl einen ebay-link angegeben.

Grüße,
Dirk
 
so... nach der Sommerpause solls jetzt in die Endphase gehen. Hab mich heut wieder hingesetzt, alles zusammengestöpselt und siehe da... das LED Display bleibt nach wie vor finster. Ich bekomm das einfach nicht gebacken. Ich hab mir den Code durchgesehen und den versteh ich soweit auch (bis auf das, was das "Dlen" zu bedeuten hat), aber irgndwie läuft das bei mir überhaupt nicht an.

Wie soll ich das angehen? Kann mir einer mal helfen und nur ein Programm schreiben, dass statisch ein Zeichen ausgibt? Das wär ein Hammer!

Ich häng nochmal das Datenblatt an.
Datenblatt

Danke schonmal! Beste Grüße
Karl
 
Hallo Carl,

das Programm war nur ein Beispiel, wie man mit BascomAVR Bytes seriell überträgt. Das Signal bzw. den Pin Dlen benötigst du nicht.

Das Display übernimmt die Daten bitweise am Pin J3-9 (DataIn), jeweils bei fallender Flanke des Taktsignals am Pin J3-10 (ClkIn). Übertragen wird im ASCII-Code zuerst LSB (Bit0), zuletzt MSB (Bit7)

Um zum Beispiel ein "A" darzustellen, überträgst du 0x41 (=0b01000001). Wenn du die Dimm-Funktion nicht nutzt, musst Pin J3-7 (DimmIn) logisch high sein.

Grüße
Dirk
 
Hallo zusammen,

Bascom bietet da doch eine fertige Lösung an:
Code:
SHIFTOUT pin , pclock , var , option [, bits , delay ]
Remarks

Pin
The port pin which serves as a data output.

Pclock
The port pin which generates the clock.

Var
The variable that is shifted out.

Option
Option can be :
0 – MSB shifted out first when clock goes low
1 – MSB shifted out first when clock goes high
2 – LSB shifted out first when clock goes low
3 – LSB shifted out first when clock goes high

Bits
Optional number of bits to shift out.

Delay
Optional delay in uS. When you specify the delay, the number of bits must also be specified. When the default must be used you can also use NULL for the number of bits.

Wäre das hier nicht eine Lösung? Soweit ich das Datenblatt richtig deuten kann, müsste die Option "2" sein, da das LSB zuerst geschickt werden muss. Mit clock low oder high bin ich mir nicht ganz sicher.
 
Hi,

wiedermal danke für eure super Hilfe. Ich habs jetzt geschafft das er ein Zeichen meiner Wahl stabil ausgibt! Super!
Mein erster Fehler war, dass ich den DIMM Eingang nicht auf High gesetzt habe. Und mit dem Bascom Shiftout Befehlt funktioniert das auch erste Sahne!

Danke nochmal. Wenn das Projekt fertig ist, werd ich es hier bereitstellen, falls es jemand mal benötigt.

Gruß
Karl

EDIT: Funzt jetzt sogar schon alles... auch die Zehntel-Sekunden werden super angezeigt!
 

Ü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)