Die 3PORTs 24LEDS Frage.

oingoboingo

Neues Mitglied
20. Juli 2010
3
0
0
Sprachen
Hallo und erstmal Moin an alle!
Ich bin neu hier. Vorstellen mach ich später mal. Hab vor 2 Monaten mit Bascom, STK500 und einen Atmega16 angefangen.
Ursprünglich wollte ich mit dem Atmega16 die Weltherrschaft übernehmen, was ich aber aufgrund meiner Programmierkenntnisse
mit Sicherheit vergessen kann. Hab am Wochenende angefangen mal was eigenes in die Hand zu nehmen und bin mit meinem..naja..
dann doch Halbwissen vorerst am Ende. Vielleicht kann mir hier ja jemand mal weiter helfen.

Ich möchte gerne 24 Leds an PortB, PortC, PortD als quasi Bargraphanzeige betreiben. Pro Pin eine LED.
Jedem Einzelnen Pin sollte per (0-5V) ADC ein (CASE X TO Y) zugeortnet werden. Also 24 X (CASE X TO Y).
So das ich Problemlos durch ändern jeder CASE Zeile die Zuweisung der ADC Spannungen ändern kann.
Wobei bei 0V keine LED und bei 5V 24 Leds leuchten sollen.
Hab auch schon ein Progamm ge-klaut-schrieben, was fürs erste erstmal funktioniert. Allerdings nur für 16 LEDS.
Das Problem ist, dass ich den 3ten Port nicht mit eingebunden bekomme. Alle Versuche mit LONG, DATATABELLEN
auf 3 PORTs aufteilen und den ganzen IF trärää sind so dermaßen Fehlgeschlagen, dass ich nun mal einen kleinen Denkanstoß brauche.
Gibt es eigentlich irgend einen Befehl zwischen HIGH und LOW? Wäre ja einfach und auch super :)

Hier ist der Code für 16 Leds. Da das PRG schonmal funktioniert und mein erstes ist, ist es erstmal ein guter Ausgangspunkt für mich.
Für einen Codeschnippsel wäre ich auch verdammt dankbar. Meiner Beziehung wegen.

GRUSS boingo



CodeBox BASCOM

$regfile = "m16def.dat"
$crystal = 1000000

'$hwstack = x
'$swstack = x
'$framesize = x

Config Portd = &B11111111
Config Portb = &B11111111
'Config Portc = &B11111111

Config Adc = Single , Prescaler = Auto
Start Adc

Dim Vin As Byte
Dim Adc_sample As Word

Dim Mind As Word
Dim Led_portd As Byte
Dim Led_portb As Byte

Do
' Waitms 10

Adc_teilungen:

Adc_sample = Getadc(0)

Select Case Adc_sample
Case 000 To 050 : Vin = 0
Case 051 To 070 : Vin = 1
Case 071 To 100 : Vin = 2
Case 101 To 150 : Vin = 3
Case 151 To 200 : Vin = 4
Case 201 To 250 : Vin = 5
Case 251 To 300 : Vin = 6
Case 301 To 350 : Vin = 7
Case 351 To 400 : Vin = 8
Case 401 To 450 : Vin = 9
Case 451 To 500 : Vin = 10
Case 501 To 550 : Vin = 11
Case 551 To 600 : Vin = 12
Case 601 To 630 : Vin = 13
Case 631 To 660 : Vin = 14
Case 661 To 690 : Vin = 15
Case Is > 961 : Vin = 16
' Case 721 To 750 : Vin = 17
' Case 751 To 770 : Vin = 18
' Case 771 To 800 : Vin = 19
' Case 801 To 830 : Vin = 20
' Case 831 To 860 : Vin = 21
' Case 861 To 890 : Vin = 22
' Case 891 To 1023 : Vin = 23

End Select

'------------------------------------------------------------

Led_portd = High(mind)
Mind = Lookup(vin , Vin_table)
Led_portd = Led_portd And High(mind)

Led_portb = Low(mind)
Mind = Lookup(vin , Vin_table)
Led_portb = Led_portb And Low(mind)

Portd = Led_portd
Portb = Led_portb

'------------------------------------------------------------
Loop

End

Vin_table:
Data &B0000000000000000%
Data &B0000000000000001% '0
Data &B0000000000000011% '1
Data &B0000000000000111% '2
Data &B0000000000001111% '3
Data &B0000000000011111% '4
Data &B0000000000111111% '5
Data &B0000000001111111% '6
Data &B0000000011111111% '7
Data &B0000000111111111% '8
Data &B0000001111111111% '9
Data &B0000011111111111% '10
Data &B0000111111111111% '11
Data &B0001111111111111% '12
Data &B0011111111111111% '13
Data &B0111111111111111% '14
Data &B1111111111111111% '15
 
Hi boingo,

herzlich Willkommen im Forum :flowers:

Ich möchte gerne 24 Leds an PortB, PortC, PortD als quasi Bargraphanzeige betreiben. Pro Pin eine LED.
Jedem Einzelnen Pin sollte per (0-5V) ADC ein (CASE X TO Y) zugeortnet werden. Also 24 X (CASE X TO Y).
So das ich Problemlos durch ändern jeder CASE Zeile die Zuweisung der ADC Spannungen ändern kann.
Wobei bei 0V keine LED und bei 5V 24 Leds leuchten sollen.
Hab auch schon ein Progamm ge-klaut-schrieben, was fürs erste erstmal funktioniert. Allerdings nur für 16 LEDS.
Das Problem ist, dass ich den 3ten Port nicht mit eingebunden bekomme. Alle Versuche mit LONG, DATATABELLEN
auf 3 PORTs aufteilen
und den ganzen IF trärää sind so dermaßen Fehlgeschlagen, dass ich nun mal einen kleinen Denkanstoß brauche.
Gibt es eigentlich irgend einen Befehl zwischen HIGH und LOW? Wäre ja einfach und auch super :)
jaaaahhhh .... ok ... kann man schon mal gelten lassen ;) Aber warum so
kompliziert ? :D

Hier ist der Code für 16 Leds. Da das PRG schonmal funktioniert und mein erstes ist, ist es erstmal ein guter Ausgangspunkt für mich.
Für einen Codeschnippsel wäre ich auch verdammt dankbar. Meiner Beziehung wegen.
Du baust eine Datentabelle mit 16Bit-Werten um sie danach auf 8Bit für
die Ports zu zerlegen. Warum machst du keine 3 Tabellen mit 8Bit ?
Also eine Tabelle für PortB eine für PortC und eine für PortD. Alle mit 24
Werten aber nur Byte-Größe. Ist doch viel einfacher ;)

Also warum erst zusamenbauen was man danach sowieso wieder zerhackt ?

Gruß
Dino
 
Hallo Dino,

besten Dank. Ist das wirklich so kompliziert? http://www.avr-praxis.de/forum/images/smilies/eek.gif
.... Den Jobs Programmier Ästhetik Preis werde ich also nicht bekommen?

Auf die Idee mit der Aufteilung bin ich ja irgendwie auch schon gekommen.
Hat allerdings nicht geklappt und habs erstmal wieder verworfen. Ich werde mich die Tage aber noch mal mit beschäftigen. Heute nicht mehr.

Wie wäre es denn im Prinzip möglich mit nur einer DATA Tabelle?
Nur der Verständnis wegen.

Gute Nacht

Boingo
 
Wenn wir mal Dinos Idee aufgreifen, dann kannst du die Sache auch noch weiter vereinfachen.
Für ADC-Werte > 400 wäre der PortD ja komplett an, für Werte > 720 auch der PortB. Nur der jeweils darüberliegende Teil müsste dann per Lookup() gesetzt werden. Damit bräuchtest du nur Byte Werte in den Data Befehlen.
Dein Select sähe dann so aus

Code:
Select Case Adc_sample
    Case 000 To 050 : Vin = 0
    Case 051 To 070 : Vin = 1
    Case 071 To 100 : Vin = 2
    Case 101 To 150 : Vin = 3
    Case 151 To 200 : Vin = 4
    Case 201 To 250 : Vin = 5
    Case 251 To 300 : Vin = 6
    Case 301 To 350 : Vin = 7
    Case 351 To 400 : Vin = 8
    Case 401 To 450 : Vin = 1
    Case 451 To 500 : Vin = 2
    Case 501 To 550 : Vin = 3
    Case 551 To 600 : Vin = 4
    Case 601 To 630 : Vin = 5
    Case 631 To 660 : Vin = 6
    Case 661 To 690 : Vin = 7
    Case 691 To 720 : Vin = 8
    Case 721 To 750 : Vin = 1
    Case 751 To 770 : Vin = 2
    Case 771 To 800 : Vin = 3
    Case 801 To 830 : Vin = 4
    Case 831 To 860 : Vin = 5
    Case 861 To 890 : Vin = 6
    Case 891 To 920 : Vin = 7
    Case 921 To 1023 : Vin = 8
End Select

Die Ports würdest du dann so setzen

Code:
If Adc_sample > 720 Then
   PortD = 255
   PortB = 255
   PortC = Lookup(vin , Vin_table)
Elseif Adc_sample > 400 Then
   PortD = 255
   PortB = Lookup(vin , Vin_table)
   PortC = 0
Else
   PortD = Lookup(vin , Vin_table)
   PortB = 0
   PortC = 0
End If

Und die Tabelle würde dann recht übersichtlich

Code:
Vin_table:
  Data &B0000_0000                                  '0
  Data &B0000_0001                                  '1
  Data &B0000_0011                                  '2
  Data &B0000_0111                                  '3
  Data &B0000_1111                                  '4
  Data &B0001_1111                                  '5
  Data &B0011_1111                                  '6
  Data &B0111_1111                                  '7
  Data &B1111_1111                                  '8
Wenn der PortC nicht funktioniert, liegt es meistens am eingeschalteten JTAG. Dann sind die Ausgänge PC.2 - PC.5 nicht nutzbar. Hast du die Fuse schon abgeschaltet?

HBA
 
Hab es heute noch mal, nach dem ich die so gängliche Fachlektüre
das hundertste mal Studiert hab, ausprobiert. 1A !!!! Funktioniert einwandfrei.
Vielen Dank noch mal euch beiden.

Also warum erst zusamenbauen was man danach sowieso wieder zerhackt ?

Da muss ich leider durch……. hab gerade mehr Lust auf Ziel setzen,
machen und lernen, als auf einfach nur abtippen und lernen.

Aber ich muss gestehen, du hast trotzdem so was von Recht ;)

Bis dann

Euer OiNGO
 
Hi,

Hab es heute noch mal, nach dem ich die so gängliche Fachlektüre
das hundertste mal Studiert hab, ausprobiert. 1A !!!! Funktioniert einwandfrei.
wer sagts denn :D Der erste Erfolg ;)

Also warum erst zusamenbauen was man danach sowieso wieder zerhackt ?
Da muss ich leider durch……. hab gerade mehr Lust auf Ziel setzen,
machen und lernen, als auf einfach nur abtippen und lernen.

Aber ich muss gestehen, du hast trotzdem so was von Recht ;)
Da ich nicht genau weiß ob du den Spruch von mir richtig verstanden hast ...
Ich hab mit dem zerhacken und zusammenbauen keine fremden abgetippten
Programme gemeint sondern deine Bits in den DATA-Zeilen.

Also warum erst 16- oder 24-Bit-Zahlen zusammenbauen wenn man später
für die Ports 8Bit-Zahlen benötigt. :D

Versuch deine Programme einfach zu halten. Denk nicht so kompliziert.
Mach es so wie unter Linux/Unix ... "Keep it small and simple"

Gruß
Dino
 

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