7_segment zahl9 anstatt 5

Gast #524585
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
Angehängte Dateien:
Gast #524626
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
Gast #524630
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!
Gast #524647
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
Gast #524689
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
Gast #524727
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



Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren