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
Hallo, Da brauchst Du gar nichts zu machen denn 0100001 sind 33 Der Port benötigt 5V-Pegel. Otto
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
> aber es klappt nicht
ist ein bischen dünn:
- was klappt nicht ?
- was hast Du gemacht ?
- was ist passiert ?
Also ich habe jetzt mehrmals versucht eine art Befehl wie Charnr=PORTB zu finden. Außerdem habe ich "Config PORTB=input" hingeschrieben. ->auf atmega übertragen ->sinnloses gewusel auf der Matrixanzeige ->spannung auf portb.6 gegeben ->keine veränderung ich habe das auch mit einem interrupt versucht $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 '### Variablendefination für Hauptprogramm Dim Cnt As Byte Dispcnt = 0 : Dispcol = 1 MFG Iron '### Konfiguration für Display Config Portd = Output Config Portc = Output '### Timersteuerung für Multiplexansteuerung konfigurieren Config Timer0 = Timer , Prescale = 8 Enable Timer0 On Timer0 Refresh_display Enable Interrupts '### Hauptprogramm: Zeichenanzeige Config Portb = Input Charnr = portb '### Interrupt-Routine: Multiplexsteuerung des Displays Refresh_display: Chradr = Charnr - 32 : Chradr = Chradr * 5 : Chradr = Chradr + Dispcnt Bitbld = Lookup(chradr , Chartab) Portc = Dispcol : Portd = Bitbld Incr Dispcnt : Dispcnt = Dispcnt Mod 5 Shift Dispcol , Left : If Dispcol = 32 Then Dispcol = 1 Return '### 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
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.
Do Charnr = Pinb 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
OK vielen Dank ich werds gleich ausprobieren ich poste dann das ergebniss Iron
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
ich denke, dass Dein Ziel ist das Programmieren zu lernen - oder ?
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 hier nochmal 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 '### Variablendefination für Hauptprogramm Dim Cnt As Byte Dispcnt = 0 : Dispcol = 1 '### Konfiguration für Display Config Portd = Output Config Portc = Output Portb = $ff 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 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000111 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00001000 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00001001 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00001010 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00001011 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00001100 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00001101 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00001110 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00001111 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00010000 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00010001 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00010010 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00010011 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00010100 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00010101 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00010111 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00011000 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00011001 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00011010 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00011011 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00011100 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00011101 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00011110 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00011111 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=# Data &B00100110 , &B01001001 , &B01111111 , &B01001001 , &B00110010 ' 36=$ Data &B00100011 , &B00010011 , &B00001000 , &B01100100 , &B01100010 ' 37=% Data &B00110010 , &B01001101 , &B01010010 , &B00100000 , &B00010000 ' 38=& Nun leuchten alle LEDs wenn kein signal anliegt.... also nur noch mal zur Sicherheit Portb.0=1 heißt 00000001 Portb.1=1 heißt 00000010 Portb.2=1 heißt 00000100 Portb.3=1 heißt 00001000 Portb.4=1 heißt 00010000 Portb.5=1 heißt 00100000 Portb.6=1 heißt 01000000 Portb.7=1 heißt 10000000 und die ports sind dort wie auf diesem bild beschriben: http://www.rn-wissen.de/index.php/Bild:Pinbelegungmega8.gif Ich bin ratlos... MFG Iron
verienfacht gesagt die anzeige zeigt nicht an was sie soll. es scheint als sei der richtige charnr-Wert nich mit dem richtigen zeichen verknüpft...
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
Hi AVRs besitzen nur interne Pull-Ups. Pull-Downs müssen extern sein. Also von jedem Portpin ein Widerstand (z.B. 10k) nach Masse. MfG Spess
Ok vielen Dank Ich denke soweit klappt dann alles ;D MFG Iron
könnte man nich einen mathematischen trick nehmen um die umgekehrten signale zu bekommen? so etwas wie charn r= Pinb *(-1) and $7F MFG Iron
charn r = not pinb charn r = char r and $7f
Damit machst Du aber sicher nicht aus einem "pull-up" einen "pull-down".....
aber wie dann? es muss doch eine Möglichkeit geben!
Widerstände (oder ein 9-poliges Widerstandsnetzwerk) zwischen den Portpins von Port B und GND einlöten.
würde es nicht reichen die chartabelle von hinten nach vorne aufzuschreiben?
Du kannst die "Pull-Downs" nicht durch Software ersetzen - das geht einfach nicht.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.