Guten Tag,
ich habe folgende Schaltung erfolgreich aufgebaut und programmiert:
[eine Matrixanzeige]
http://www.dieelektronikerseite.de/uC%20Ecke/Lections/Matrixanzeigen%20-%20LEDs%20in%20Reih%20und%20Glied.htm
Das Programm:
$regfile "m8def.dat"
$crystal = 1000000
'### Variablendefination für Zeichengenerator
Dim Dispcol As Byte
Dim Dispcnt As Byte
Dim Bitbld As Byte
Dim Chradr As Word
Dim Charnr As Byte
'### Konfiguration für Display
Config Portd = Output
Config Portc = Output
Dispcnt = 0 : Dispcol = 1 : Charnr = 65
'### Hauptprogramm: Zeichenanzeige
Do
Chradr = Charnr - 32 : Chradr = Chradr * 5 : Chradr = Chradr + Dispcnt
Bitbld = Lookup(chradr , Chartab)
Portc = Dispcol : Portd = Bitbld : Waitms 1
Incr Dispcnt : Dispcnt = Dispcnt Mod 5
Shift Dispcol , Left : If Dispcol = 32 Then Dispcol = 1
Loop
'### Zeichensatztabelle
Chartab:
Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 '
32=spc
Data &B00000000 , &B00000000 , &B01011111 , &B00000000 , &B00000000 '
33=!
Data &B00000000 , &B00000011 , &B00000000 , &B00000011 , &B00000000 '
34=Bracket
Data &B00010100 , &B01111111 , &B00010100 , &B01111111 , &B00010100 '
35=#
u.s.w...
Ich möchte durch einen Input festlegen welches Zeichen angezeigt wird.
Ich dachte mir Port B als Input zu benutzen. Leider Kann ich nicht
selbst programme schreiben, weil ich keine Programmiersprache kann. Ich
weiß auch nicht welche spannung ich an port b dann als signal anlegen
soll. Wäre super wenn mir jemand sagt wie die Schaltung dazu aussehen
soll und mir das Programm schreiben könnte ;D
MFG Iron
das hab ich noch vergessen...
ich dachte mir das zeichen durch ein 7stelligen code festzulegen. um ein
ausrufezeichen darzustellen müsste man an port B also 0100001 anlegen.
Also immer nach dem ascii-code. wenn ich das richtig verstanden habe ist
Chradr der wert der das zeichen definiert. Man müsste dem
microcontroller also iwie sagen wie er von 0100001 auf 33 kommt. Ich
hoffe ihr versteht was ich meine. Aber da ich wirklich nur mit
vorgegebenen Programmen arbeiten kann wäre es super wenn mir jemadn das
Programm schreiben kann. Vielen Dank ;D
MFG Iron
Danke für deine Antwort!
also reicht es, wenn ich das schreibe?
Do
For Charnr = 32 To 127
For Cnt = 0 To 500
Chradr = Portb
Bitbld = Lookup(chradr , Chartab)
Portc = Dispcol : Portd = Bitbld : Waitms 1
Incr Dispcnt : Dispcnt = Dispcnt Mod 5
Shift Dispcol , Left : If Dispcol = 32 Then Dispcol = 1
Next Cnt
Next Charnr
Loop
Erkläre mir bitte den Sinn der 2 Schleifen (Charnr und Cnt) - Du mußt
nur mit dem vom Port eingelesenen ASCII-Wert auf Deine Lookup-Table
zugreifen.
Oder hast Du mehrere Displays, welche Du ansteuern möchtest ?
nun ja ... deswegen frag ich ja ob mir jemand das programm schreiben
kann^^ ich weiß zu wenig von Microcontrollern und Programmiersprachen.
Ich bin 9te Klasse auf dem Gymnasium ;D Aber ich kann meinen Atmega8
flaschen und schaltungen aufbauen =)
Ich habe nur eine Matrixanzeige und möchte ein Zeichen durch den input
vorgeben und dieser soll dann dargestellt werden. Alles gemäß dem assci
code. Momentan versuche ich das Programm aus dem Tutorial von der seite
oben so zu verändern,dass es meinem Wunsch entspricht, aber das klappt
leider nicht. Ich bitte weiter um Hilfe
Iron
Das Originalprogramm zeigt Dir ein "A" an, welches durch "Charnr = 65"
vorgegeben wurde.
- Konfiguriere Port B als Input
- Lies in der "DO"-Schleife Deinen Port B ein
- Setze Charnr = Portb (oder heißt das in Basic auch Pinb?)
Achtung: ich programmiere nicht in Basic - die Feinheiten musst Du
ausknobeln.
Hört sich ja einfach an ^^ aber es klappt nicht könnte mir vl jemand das
programm dem entsprechend umschreiben? ich würde mich echt sehr freuen .
Danke ;D
Man kann ein wildes Blinken sehn aber es scheint ein wenig darauf zu
reagieren. Je nachdem ob mein ein signal an einen Port anlegt leuchten
ein paar leds mehr oder weniger auf.
Iron
Zuerst einmal brauchst Du einen Input nicht zu definieren, wie ich
mittlerweile las.
Weiterhin solltest Du das Eingangs genannte Programm dahingehend
modifizieren, dass Du den Port einliest - das müsste mit Charnr = Pinb
funktionieren - ansonsten sieh in der BASCOM-Hilfe nach.
Drittens musst Du sicherstellen, dass am Eingang auch wirklich das
gewünschte Muster anliegt - es reicht nicht, zwei Leitungen für "33"
daran zu basteln, sondern Du musst sicherstellen, dass alle Leitungen
des Ports definierte Pegel (also "0" oder "1") haben - ggf.
Pull-down-Widerstände einsetzen.
Wildes ausprobieren bringt nichts ausser Zeitverlust - nimm das Programm
aus Deinem 1. Post und lies den Port ein - das war es.
aus dem tutorial : "Die beiden Taster werden wieder gegen Null
geschaltet, damit wir die AVR-eigenen Pullup-Widerstände verwenden
können."
was ist mit gegen Null schalten gemeint? heißt das ich brauche keine
widerstände? Da Portb 8bits hat und ich nur 7bits brauche, was mache ich
dann mit dem übrigen?
Iron
Du möchtest das anzuzeigende Zeichen mit Tastern anzeigen ?
Bitte beschreibe genau, mit wieviel Tastern und wie das genau
funktionieren soll.
Die Pull-Up des Controllers nimmt man, um externe Widerstände zu sparen.
Wie genau soll das funktionieren - Du müsstest die Taster ja dann gemäß
ASCII-Tabelle betätigen - bis zu 7 gleichzeitig.
Wenn Du nur 7 bit auswerten müchtest, kannst Du das 8. ausmaskieren,
indem Du z. B. "Charnr" mit 127 (= 0111 1111) verundest.
ich habe mir ein Lochstreifenlesegerät gebastelt. Das ganze dient nur
der veranschaulichung, d.h. ich stelle nur einen kleinen Lochstreifen
her. Das ein langer lochstreifen zu aufwändig ist ist mir klar ;)
Ich beschäftige mich damit, weil wir grade die codes in Informatik
behandeln.
Ein problem könnte sein, wenn der lochstreifen beim durchziehen ein
sinnloses Signal durchgibt, dass die anzeige dann spinnt. Also habe ich
die Chartabelle um 31 stellen erweitert und das "-32" bei chradr
weggelassen:
Do
Charnr = Pinb
Chradr = Charnr : Chradr = Chradr * 5 : Chradr = Chradr + Dispcnt
Bitbld = Lookup(chradr , Chartab)
Portc = Dispcol : Portd = Bitbld : Waitms 1
Incr Dispcnt : Dispcnt = Dispcnt Mod 5
Shift Dispcol , Left : If Dispcol = 32 Then Dispcol = 1
Loop
'### Zeichensatztabelle
Chartab:
Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000
Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000001
Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000010
Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000011
Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000100
Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000101
Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000110
usw.
MFG Ironkekz
Wenn der Lochstreifenleser ein ordnungsgemäßes TTL-Signal ausgibt,
sollte das funktionieren - wichtig ist nur, dass Du das Signal
"zwischenspeicherst", bis der nächste gültige Wert gelesen wurde.....
Hi
>Ein problem könnte sein, wenn der lochstreifen beim durchziehen ein>sinnloses Signal durchgibt, dass die anzeige dann spinnt. Also habe ich>die Chartabelle um 31 stellen erweitert und das "-32" bei chradr>weggelassen:
Hättest du dir mit einem einfachen 'if Charnr >=32...' ersparen können.
MfG Spess
hatte ich auch vor aber bascom hatt dann immer ne fehlermeldung
geschickt. Wie gesagt ich hab keine ahnung vom Programmieren. Aber du
könntest mir ja sagen wie es weiter gehen könnte nach if charnr <32...
Iron
Hi
>Wie gesagt ich hab keine ahnung vom Programmieren.
Und ich eigentlich keine Ahnung von BASCOM.
>hatte ich auch vor aber bascom hatt dann immer ne fehlermeldung>geschickt.
Welche? Eine if-Anweisung sieht immer so aus:
if <Bedingung> then
Code
end if
>Aber du könntest mir ja sagen wie es weiter gehen könnte nach>if charnr <32...
Rate mal, warum ich 'if Charnr >=32...' angeraten habe? Da gibt es etwas
zu tun. Bei deiner nicht.
MfG Spess
eigentlich dürfte die anzeige, wenn kein signal anliegt doch auch nichts
anzeigen. Stattdessen leuhten abwechelnd alle LEDs ein @ oder ein ?. Das
ist zwar lustig aber nicht beabsichtig. Warum ist das so. wie kann ich
das verhindern?
Hi
>eigentlich dürfte die anzeige, wenn kein signal anliegt doch auch nichts>anzeigen.
Wenn die Pins offen sind, fangen sie sich alle möglichen Pegel ein.
Dagegen helfen Pull-Up- oder Pull-Down-Widerstände. Im einfachsten Fall
dir internen Pull-Ups aktivieren: 'PortB=$FF'.
MfG Spess
Also ich hab ihn jetzt so programmiert dass er wenn ein wert unter 32
anliegt, er diesen also binärcode darstellen müsste. trotzdem danke ;)
Frage: Wie kommt der Atmega8 von der Binärzahl zur Dezimalzahl?
wenn pinb.0 = 1
pinb.1 = 1
und alles andere 0 ist müstte da doch 3 rauskommen ja?
Ich vertehe nicht warum die anzeige bei keinem Signal wie oben genannt
reagiert. Ab welcher spannung zählt das signal als 1? Vielleicht fließt
irgendein Schwachstrom?!?
MFG Iron
Hi
>Also ich hab ihn jetzt so programmiert dass er wenn ein wert unter 32>anliegt, er diesen also binärcode darstellen müsste.
Wie?
>Frage: Wie kommt der Atmega8 von der Binärzahl zur Dezimalzahl?>wenn pinb.0 = 1>pinb.1 = 1>und alles andere 0
Ergibt Binär 0b00000011. Und das ist 3.
>...ist müstte da doch 3 rauskommen ja?
Siehe oben.
MfG Spess
Also für "3" hast Du in Deiner Tabelle auch kein Muster definiert - oder
?
Eine Binärzahl ist eine Dezimalzahl - es ist nur eine andere Art der
Darstellung.
Hi
>Nun leuchten alle LEDs wenn kein signal anliegt....
Wenn kein Signal anliegt und die internen Pull-Ups eingeschaltet sind
ist das Eingangssignal $FF. Dafür existiert aber kein Eintrag in deiner
Tabelle.
Evtl. hilft das:
Charnr = Pinb and $7F
MfG Spess
Ich habe das jetzt mal mit dem IF befehl geschrieben:
'### Konfiguration für Display
Config Portd = Output
Config Portc = Output
Portb = $ff
Do
If Pinb > 32 Then
Charnr = Pinb and $7F
End If
If Pinb < 32 Then
Charnr = 32
End If
Chradr = Charnr -32 : Chradr = Chradr * 5 : Chradr = Chradr + Dispcnt
Bitbld = Lookup(chradr , Chartab)
Portc = Dispcol : Portd = Bitbld : Waitms 1
Incr Dispcnt : Dispcnt = Dispcnt Mod 5
Shift Dispcol , Left : If Dispcol = 32 Then Dispcol = 1
Loop
und die Tabbelle beginnt wieder erst beim 32ten Eintrag. Meinst du das
könnte klappen?
Hi
> If Pinb > 32 Then> Charnr = Pinb and $7F> End If> If Pinb < 32 Then> Charnr = 32> End If
Eine IF-Anweisung kann auch einen Else-Zweig enthalten.
if <Bedingung> then
Code für den die Bedingung zutrifft
else
Code für den die Bedingung nicht zutrifft
end if
MfG Spess
Och ich bin soo blöd ^^
es unktioniert eigentlich alles. ich habe nich daran geadacht , dass der
port mit signal, 0 ist und nicht 1. und die ports ohne signal 1
sind^^.... das lag jetzt an den Pull-Ups oder? kann ich das auch um
gekehrt machen? es soll bei jedem signal auch eins am port heißen. sind
das dann Pull-downs?. weißt du auch wie ich die aktivieren kann?
Vielen Dank - Ironkekz
So das war es jetzt wirklich ;)
Indem man bei der tabelle unten und oben vertauscht (quasi gespiegelt)
hat, konnte man die pull-ups benutzen. ist eigentlich ganz logisch wenn
man weiß wie die buchstaben erzeugt werden. Ich habe noch 32 einträge
mit dem entsprechendem wer als binärzahl, der tabelle hinzugefügt und
dann die "-32" weggelassen. Nun Funktioniert alles einwandfrei.
Vielen Dank für eure Hilfe.
MFG IronKekz