Hallo bin Neue hir , mit einigen fragen

Hallo!

habe jetzt so ein Code gebastelt!
ADC String und Array!
Denn ADC mit 8-bit

Von 0 bis 255 geht!
Aber 255 bis 0 geht nicht, anstatt wieder 000 anzuzeigen ist denn 110.:smile:

Bitte um Hilfe!

Code:
$regfile = "m8def.dat"
$crystal = 8000000       'Intern
$hwstack = 32
$swstack = 40
$framesize = 40

Ddrb = &B11111111       ' PB6...PB0 7-Segment G.F.E.D.C.B.A
Portb = 255
Ddrc = 00000000
Ddrd = &B11100000       ' PD7...PD5 Ausgang Ziffer_1 ....Ziffer_3

'===========ADC Config
Admux = &B01111000
'       mux   Bits7+6=01:Ref intern
'       mux   Bit5=1: LeftAdjust, nur 8 Bit in ADCH
'       mux   Bit3..0: ADC Kanal wa"hlen
Adcsra = &B11101111
'       sra   Bit7=1:AdcAn  Bit6=1:Start  Bit5=1:Frei
'       sra   Bit3=0:InterruptAn  Bit2..0=010: AvrClock/4

'==========Variablen
Dim Sensor As Byte       '          Sensor an ADC(0)
Dim Sensor_str As String * 3       'Sensor_Str 3 Ziffern
Dim Sensor_ar(4) As Byte
Dim Ziffer_1 As Byte
Dim Ziffer_2 As Byte
Dim Ziffer_3 As Byte

Do
      Sensor = Adch       '                      ADC 8bit
      Sensor_str = Str(sensor)       '           String
      Str2digits Sensor_str , Sensor_ar(1)       'Array

For Ziffer_1 = 5 To 5       'Ziffer_1 PD5

   Select Case Sensor_ar(4)       ' Array ERSTE Stelle ADC
      Case 0 : Portb = &B1000000       '0
      Case 1 : Portb = &B1111001       '1
      Case 2 : Portb = &B0100100       '2
      Case 3 : Portb = &B0110000       '3
      Case 4 : Portb = &B0011001       '4
      Case 5 : Portb = &B0010010       '5
      Case 6 : Portb = &B0000010       '6
      Case 7 : Portb = &B1111000       '7
      Case 8 : Portb = &B0000000       '8
      Case 9 : Portb = &B0010000       '9
   End Select
      Portd.ziffer_1 = 1       'PD5 An
   Waitus 500
      Portd.ziffer_1 = 0       'PD5 Aus
Next
For Ziffer_2 = 6 To 6

   Select Case Sensor_ar(3)       'Array ZWEITE Stelle von ADC
      Case 0 : Portb = &B1000000
      Case 1 : Portb = &B1111001
      Case 2 : Portb = &B0100100
      Case 3 : Portb = &B0110000
      Case 4 : Portb = &B0011001
      Case 5 : Portb = &B0010010
      Case 6 : Portb = &B0000010
      Case 7 : Portb = &B1111000
      Case 8 : Portb = &B0000000
      Case 9 : Portb = &B0010000
   End Select
      Portd.ziffer_2 = 1       'PD6 An
   Waitus 500
      Portd.ziffer_2 = 0       'PD6 Aus
Next
For Ziffer_3 = 7 To 7

   Select Case Sensor_ar(2)       'Array DRITE Stelle von ADC
      Case 0 : Portb = &B1000000
      Case 1 : Portb = &B1111001
      Case 2 : Portb = &B0100100
      Case 3 : Portb = &B0110000
      Case 4 : Portb = &B0011001
      Case 5 : Portb = &B0010010
      Case 6 : Portb = &B0000010
      Case 7 : Portb = &B1111000
      Case 8 : Portb = &B0000000
      Case 9 : Portb = &B0010000
   End Select
      Portd.ziffer_3 = 1       'PD7 An
   Waitus 500
      Portd.ziffer_3 = 0       'PD7 Aus
Next

Loop
End

Gruß
Sucharik
 
Und was ist jetzt Deine Frage? Hast Du nicht verstanden, warum das so ist? (Eigentlich ganz simpel - wenn man erstmal drauf gekommen ist)
Oder kommst Du nicht damit klar, wie Du das umgehen kannst?

Zur ersten Frage:
-geh nochmal in Gedanken genau durch, was die 3 Instruktionen (ADC holen ... -> ... Ziffernarray erstellen) genau machen.
-Was steht im Ziffernarray, bevor der nächste ADC da rein extrahiert wird?
-Was ist jetzt der Unterschied zwischen den ADC-Werten 0b01100100 und 0b01100011 bzw zwischen 0b00001010 und 0b00001001 ?
-Wie wird dadurch das Ziffernarray beeinflusst?

btw: was soll das mit den beiden for-Schleifen da unten eigentlich darstellen? Dir ist schon klar, daß jede davon genau einmal durchlaufen wird, oder?
-indexvariable = x
-wenn Indexvar<= x mache:
--schleifeninhalt
--incr indexvariable
--zurück sur Abfrage, wo jetzt indexvariable>x, deswegen:
-Schleifenabbruch, und weiter im Programm
 
Zur ersten Frage:
1: -geh nochmal in Gedanken genau durch, was die 3 Instruktionen (ADC holen ... -> ... Ziffernarray erstellen) genau machen.
2: -Was steht im Ziffernarray, bevor der nächste ADC da rein extrahiert wird?
3: -Was ist jetzt der Unterschied zwischen den ADC-Werten 0b01100100 und 0b01100011 bzw zwischen 0b00001010 und 0b00001001 ?
4: -Wie wird dadurch das Ziffernarray beeinflusst?

1: Jedem von 3 Instrimenten wird
eine Array ziffer zugeordnet 2 5 5
^---Zifferarray (2)
^-----Zifferarray (3)
^------Zifferarray (4)
2: Von 0 bis 255 ist eins weniger also wenn 4 dann kommt 5, nach 5 kommt 6
von 255 bis 0 ist eins wehr 6 dann 5 , 5 dann 4
Ist das richtig so???:confused:

3: ADC-Werten 0b01100100 = 100
0b01100011 = 99
0b00001010 = 10
0b00001001 = 9
Wird denn ADC-Wert in 11-schrieten abgezählt?
also von 0 bis 10 anstatt 0 bis 9
4: und dieses elfte schritt bleibt im Zifferarray?

Das die beiden For-Schleifen nuhr einmal durchlaufen wahr mir nicht bewust!:confused:

-indexvariable = x
-wenn Indexvar<= x mache:
--schleifeninhalt
--incr indexvariable
--zurück sur Abfrage, wo jetzt indexvariable>x, deswegen:
-Schleifenabbruch, und weiter im Programm
Dein Beispiel kriege ich noch nicht umgesetzt!
Vielleicht bin noch zu blöd dafür.:banghead:

Aber aufgehben werde ich es auch nicht!
 
Ok, ich erklärs mal (nachvollziehen must Du):
Was macht Dein Programm, wie Du es da jetzt hast eigentlich?
Konfig der PORTs und Dimensionierung der VARs sollten soweit klar sein.
Dann weist Du ADMUX folgendes zu:
-MUX3..MUX0=1000 - Das wäre Dezimal 8, den Channel gibts gar nicht. Schau mal ins Datenblatt Seite 199/200. 0 bis 5(7 bei TQFP) gibts, 14 wäre dann 'ne interne 1,3V-Referenz, 15 = Gnd.
-Bit 4 ist "unused", da solltest Du keine 1 reinschreiben (was aber hier keinen Effekt hat)
-ADLAR=1 - Ok, zum Auswerten von 8bit Genauigkeit /Auflösung reicht jetzt das Auslesen von ADCH
-REFS1..0 = 01 - Gemessen wird also über intern verwendeten AVcc
Nun ADCSRA:
-ADPS2..ADPS0=111 - ADC-Prescaler ist also lt DB 128. Jeder 128ste Takt des Oszillators (8MHz) also ein ADC-Takt. Also Effektiv 62,5kHz
-ADIE=1 aktiviert den "ADC ist fertig" Interrupt. Also wenn der ADC mit einer Konversion fertig ist, setzt er (immer) Das Interrupt Flag ADIF. Wenn Du hier jetzt den ADC-Interrupt freigibst, wird normalerweise in diesem Moment der ADC-Interrupt-Vector angesprungen. Den hast Du gar nicht implementiert! Es passiert hier nur nichts, weil Du interrupts global nicht freigegeben hast.
-ADIF=0 hat auf das Interrupt-Flag keine Auswirkung, eine 1 würde es löschen, ist soweit richtig
-ADFR=1 schaltet den FreeRunningMode ein, es wird also nach jeder Wandlung sofort eine weitere gestartet. Die erste benötigt 25 ADC-Takte (dann wird das Ergebnis in die ADCH/L-Register geschrieben, und das Flag gesetzt. Weil der ADC frei weiterläuft benötigt jede weitere Wandlung 13 ADC-Takte. Jetzt wird das ADCH/L also quasi mit 4,8kHz aktualisiert.
-ADSC=1 hier wird die erste Konversion angestoßen (danach siehe free running)
-ADEN=1 aktiviert den ADC erst überhaupt.

Die beiden Register werden (jedes für sich) mit einem Wisch gesetzt, soweit ist das richtig. Aber das da oben ist sicher nicht genau das, was Du willst.

Zu meinem "Beispiel": Das hast Du falsch verstanden. Ich wollte quasi in Pseudo-Code zeigen, was Deine For-Schleifen eigentlich machen.

Dein Problem mit der fehlenden Aktualisierung der führenden Stellen ist im Prinzip der Unterschied zwischen den Strings "001" und "1". als Zahl ist Das beides=1, wenn jetzt also 'ne 3stellige Zahl dargestellt wurde, und jetzt wird der Wert 2stellig, wird str(Bytevariable) nur noch ein String mit 2 Zeichen (und dem Stringende-Symbol). Str2digits verarbeitet also nur diese, die dritte Stelle bleibt unverändert. Du hattest vorher keine führende 0.
 
Danke!

Ich versuche das ganze zu verstehen
Und zu realisieren

Gruß
Sergej
 
Hat sich erledigt!

7-SEG Anzeige tut es nach Vorschriften.

So mit Thema geschlossen meinerseits.

Gruß
Sergej
 
Code:
If Sensor_ar(4) = 1 Then Sensor_ar(4) = 0

am Code selbst nix gäendert!
 

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