2-Stellige LED-7Segment an Atmega

Supi, ich habe nun die Anzeige an Port D angeschlossen, und die beiden Transis zur Umschaltung an PB0 und PB1 . Läuft sauber.
Wie bekomme ich nun 3 oder noch mehr Anzeigen zum laufen?

Mein Problem ist die "IF-Then-Else" Reihe, zur Umschaltung der Transis.

If A = 1 Then
Portb.0 = 1
Portb.1 = 0
Portd = Led1
A = 0
Else
Portb.0 = 0
Portb.1 = 1
Portd = Led2
A = 1
End If

Das sind ja nur 2 "Zustände", ich bräuchte aber für jede Anzeige einen Zustand.

Helft mir doch mal dabei, ich komme da garicht klar :(
 
Ich glaube mein wirkliches Problem beschränkt sich NUR auf "If - Then" :eek:

Soll 4 LED-Anzeigen steuern:
Port D = Anzeige, PinB (0 1 2 3) High = LED-Stelle ein!
Timer0 = Timervorgabe
If A = 1 Then
Portb = 1
Portd = Led1
End If

If A = 2 Then
Portb = 2
Portd = Led2
End If

If A = 3 Then
Portb = 4
Portd = Led3
End If

If A = 4 Then
Portb = 8
Portd = Led4
End If

Incr A
If A = 4 Then A = 1
End If '<<< Zeile 93
Return

Gedanklich bin ich doch garnicht so falsch, oder?

Trotzdem gibts nur Fehlermeldungen :
Error: 28 - IF THEN expectet, in File :
Error : 7 - IF THEN expected [END IF in source 93]
Error:350 - Interrupts needs return , in File :

(Alles in Line:93)
 
Hallo Michael,

nun gibts auch gleich noch die nächste Info von mir zu einem anderen Thema von Dir :)

In der Programmierung ist es in solch einem Fall wie Du ihn hast guter Stil, die ganzen Abfragen nicht über If-Then oder If-Then-Else zu machen. Das ist aufwändig und unübersichtlich.

Viel viel eleganter geht es mit einem sogenannten Switch-Case-Verteiler der in der Regel ab 2 Entscheidungsgrößen verwendet wird. Er trägt deutlich zu Übersicht bei uns ist auch ganz einfach anzuwenden.

Ich würde Dir also jetzt nicht versuchen zu erklären wo Dein Problem mit Deinen If-Konstrukten liegt sondern ich würde Dir eine Hilfestellung für den Switch-Case geben. In BASCOM gibt es die gleichen Konstrukte, sie heißen nur etwas anders. Man spricht hier vom Select-Case:

Die BASCOM Hilfe sagt dazu folgendes:

SELECT CASE var
CASE test1 : statements
[CASE test2 : statements ]
CASE ELSE : statements
END SELECT

Für Dein konkretes Beispiel würde die Lösung so aussehen:

Code:
Select Case A
     Case 1:
          Portb = 1
          Portd = Led1
     Case 2:
          Portb = 2
          Portd = Led2
     Case 3:
          Portb = 4
          Portd = Led3
     Case 4:
          Portb = 8
          Portd = Led4
End Select
Probiers aus! Vielleicht hilft Dir das weiter!

Ach übrigend, habe gerade entschieden Dich nicht dumm ins Wochenende gehen zu lassen:)
Aus diesem Grund schreibe ich Dir noch kurz, worin der prinzipielle Fehler in Deinem IF-Then-Konstrukt besteht:

Die Formulierung
Incr A
If A = 4 Then A = 1
End If '<<< Zeile 93
Return
ist falsch!!! Wenn Du "If A = 4 Then A = 1" in einer Zeile schreibst dann benötigt man kein "End If". Es gibt zwei richtige Lösungen.

Also, entweder so:

Incr A
If A = 4 Then A = 1
Return


oder so:

Code:
Incr A
If A = 4 Then 
   A = 1
End If
Return

Grüße und schönes Wochenende,

Markus
 
Hi,
auf der Suche nach Infos bzgl. 7Segment-Multiplexing bin ich hier auf den Beitrag gestoßen.

Habe den Code etwas angepasst und nun läufts.

Änderung: nur die benutzten PINS als Output definieren und im Case-Select zwischen den PINS wechseln und den nichtbenutzten jeweils deaktivieren.

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

Config Timer0 = Timer , Prescale = 64
On Timer0 Test
Const Timervorgabe = 178

Enable Timer0
Enable Interrupts

Dim A As Byte                                               'fuer umschaltung einer/zehner
Dim Kanal As Byte
Dim Einer As Byte
Dim Zehner As Byte
Dim Raus As Byte
Dim Led1 As Byte                                            'einerstelle
Dim Led2 As Byte                                            'zehnerstelle

Config Portb = Output                                       ' ziffer

Config Portc.0 = Output                                     ' segmentanzeige Einer
Config Portc.1 = Output                                     ' segmentanzeige Zehner

Main:
A = 1                                                       ' A mit 1 vorbelegen
Do

For Kanal = 0 To 99
Gosub Leddisplay
Waitms 500                                                  'Delay auf 1/2 Sek erweitert
Next Kanal

Loop

Leddisplay:
Einer = Kanal Mod 10
Zehner = Kanal / 10
Led1 = Lookup(einer , Segmente)

Raus = Lookup(zehner , Segmente)
If Raus = &H3F Then Raus = 0
Led2 = Raus
Return

End

Segmente:
Data &H3F , &H06 , &H5B , &H4F , &H66 , &H6D , &H7D , &H07 , &H7F , &H6F , &H6F


 Test:
Timer0 = Timervorgabe


Select Case A
 Case 1 :
  Portc.0 = 1                                               ' Einer aktivieren
  Portc.1 = 0                                               ' Zehner deaktivieren
  Portb = Led1
  A = 2                                                     'Anzeige wechseln
 Case 2:

  Portc.1 = 1                                               'einer deaktivieren
  Portc.0 = 0                                               'zehner aktivieren
  Portb = Led2
  A = 1                                                     ' Anzeige wechseln
End Select

Return

Gruß
clear:cool:
 

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