Forum: Mikrocontroller und Digitale Elektronik 7_segment zahl9 anstatt 5


von steffen (Gast)


Angehängte Dateien:

Lesenswert?

hallo will temperatur an 7-segment anzeigen anzeigen!
es funktioniert wirklich alles, außer das wenn er ne 5 anzeigen soll ne 
9 anzeigt! die Zahlen liegen im richtigen bit-muster!

Komm einfach nicht mehr weiter!
ach ja wenn ich saft drauf gib leuchtet das zeichen was bei der neun 
mitleuchtet, aber bei der fünf nicht leuchten sollte so ca.5 sec! dann 
springt er auf meine temperatur!

Vieleicht hat ja jemand ne idee!

Danke

von Stefan (Gast)


Lesenswert?

Kommt auch statt einer 6 eine 8?

von Stefan (Gast)


Lesenswert?

Schaltplan?

von Falk (Gast)


Lesenswert?

@steffen

>es funktioniert wirklich alles, außer das wenn er ne 5 anzeigen soll ne
>9 anzeigt! die Zahlen liegen im richtigen bit-muster!

Wie hast du das geprüft? Lass mal deine UART Sache weg und gib mal 
konstante Zahlen aus. Stimmen dann alle Bitmuster von 0..9?

>ach ja wenn ich saft drauf gib leuchtet das zeichen was bei der neun
>mitleuchtet, aber bei der fünf nicht leuchten sollte so ca.5 sec! dann
>springt er auf meine temperatur!

Ich seh da im Moment nicht den Fehler.
Allerdings ist dein MUX Interrupt noch nicht OK. Bei Drei 
Anzeigenbrauchst du logischerweise 3 Fälle in deinem select und nicht 6. 
Ausserdem soltest du den Timer auf einen höhere Freqeuz einstellen, ca. 
300 Hz (da ergibt dann 100 Hz Bildwiderholfreqeunz = flimmerfrei).

MFG
Falk

von steffen (Gast)


Lesenswert?

hab eine platine dazu gebaut!
wenn ich sie einzeln darstellen will funktioniert es ja, also liegt es 
nicht an den anzeigen!

das blöde ist glaub ich alle siebensegmentanzeigen, also a,d,e,f,g 
liegen beim pic16f628a am port B und der b von der siebensegmentanzeige 
liegt am port A vom pic!

von steffen (Gast)


Angehängte Dateien:

Lesenswert?

Schaltplan gibt es hier!

von Falk (Gast)


Lesenswert?

@steffen

>hab eine platine dazu gebaut!
>wenn ich sie einzeln darstellen will funktioniert es ja, also liegt es
>nicht an den anzeigen!

Dann ist es zu 99%ei Softwareproblem deiner UART Empfangsroutine.

Versuchs mal damit.

   while true
     if Usart_Data_Ready = 1 then  'Daten eingetroffen?

       i = Usart_Read              'Ja -> UART-Puffer auslesen (ein 
Zeichen)

                  'Auf Startkennung (=Vorzeichen + oder -) warten
       if i = 43  then    '+ ? ASCII-Code "+" =43
          treffer = 1
          PORTA.3 = 1     'Bei + "Minus-LED" aus
          n=0             ' reset für Pufferindex
       end if
       if i = 45  then    'oder - ? ASCII-Code "-" =45
          treffer = 1
          PORTA.3 = 0     'Bei - "Minus-LED" an
          n=0             ' reset für Pufferindex
       end if

       if treffer = 1 then 'Puffer füllen
          'Usart_Read_Text(puffer, delim)'bis LF
          Puffer [n]=i - 48 'Ankommendes ASCII-Zeichen nach Byte wandeln
          n = n+1
       end if

       if n >= 7 then  'Alle Zeichen eingetroffen?
          n = 0
          treffer = 0

         ' Update nur dann, wenn alle Zeichen eingetroffen sind
         'Digitalanzeige ansteuern
         por[0] = Mask(Puffer[3]) '10er Stelle
         por[1] = Mask(Puffer[4]) '1er Stelle
         por[2] = Mask(Puffer[6]) '1. Nachkommastelle
       end if

     end if

MfG
Falk

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Würde auf ´nen Programmfehler tippen.

von brain (Gast)


Lesenswert?

schau mal ob es funktioniert, wenn du ein paar nops einbaust,
hatte vor kurzem fast das gleicche problem

von steffen (Gast)


Lesenswert?

ne so zeigt sie nur lauter misst an!

aber trozdem danke

von Falk (Gast)


Lesenswert?

Dann machs mal wieder teilweise wie im Original

      if treffer = 1 then 'Puffer füllen
          'Usart_Read_Text(puffer, delim)'bis LF
          n = n+1
          Puffer [n]=i - 48 'Ankommendes ASCII-Zeichen nach Byte wandeln
       end if

MFG
Falk

von Falk (Gast)


Lesenswert?

Ahhhhh, ich habs!

Deine Dekodierung des Segment B ist falsch!

sub function BSeg(dim num as byte) as byte 'Wird das B-Segment der 
Anzeige benötigt?
    select case num
      case 5,6 result = 1
      case else result = 0
    end select
end sub

Diese Fuktiongeht davon aus, dass sie mit Zahlen 0..9 gefüttert wird 
(BCD).

Du benutzt sie aber hier mit 7-Segmentcode.

 PORTA.4 = BSeg(por[0])

Mach einfach ein zweites Array und speichere dort Segement B, genauso 
wie du es mit por machst.

MfG
Falk




von steffen (Gast)


Lesenswert?

coll danke probier ich morgen aus!

jetzt ist leider feierabend!

von Falk (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal eine etwas aufgeräumte Variante.

MFG
Falk

von Falk (Gast)


Angehängte Dateien:

Lesenswert?

Mist, falsche Datei erwischt! :-(

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.