Hallo Forum, da ich ein Elektroniklaie bin und auch mit bascom-programmierung keine Erfahrung habe, möchte ich euch mal um Hilfe bitten. Ich habe die beiliegende Schaltung auf meinem Steckbrett aufgebaut. Dabei habe ich aber anstatt der drei Schalter nur Kabelbrücken im Einsatz. Sollte aber prinzipiell die gleiche Funktion haben. Sinn ist es nun, die Schleife bei Drücken des einen Tasters (Pinb0) zu unterbrechen und neue Zahlen aufzunehmen. Dabei soll mittels 2. Taster die neue Zahl "aufgenommen" werden (durch hochzählen) und durch drücken des dritten Tasters dann in das eeprom geschrieben werden. Wenn Taster 1 (Pinb0) wieder losgelassen wird, soll wieder zurück in die Schleife gesprungen werden. Angemerkt werden muss noch, dass eben nicht nur eine neue Zahl eingetippt werden können soll, sondern bis zu 10 (dabei habe ich momentan weder einen "Überlauf" bei der Zahl noch bei der Anzahl abgefangen, das kommt später!), daher auch die while-schleife für den gedrückten pinb.0. hier nun die Schaltung. Ich hoffe, ich habe nicht allzu viele Fehler und Unsinn eingebaut. 'name : eeprom schreiben.bas 'purpose : Versuchsschaltung 'micro : attiny24 '----------------------------------------------------------------------- -------- $regfile = "attiny24.dat" ' specify the used micro $crystal = 128000 ' used crystal frequency $hwstack = 20 ' default use 32 for the hardware stack Config Adc = Single , Prescaler = Auto Config Portb = &B00000000 ' oder lieber ddrb = &B00000000 ? Config Porta = &B11111111 ' oder lieber ddra = &B00000000 ? ' 7-Segment-Anzeige Zuordnung zu den Pins: ' a -> Pinb.0 ' b -> Pinb.1 ' c -> Pinb.2 ' d -> Pinb.3 ' e -> Pinb.4 ' f -> Pinb.5 ' g -> Pinb.6 ' dp-> Pinb.7 Dim B As Byte Dim A As Byte Dim Eingang As Byte Dim Nmz As Eram Byte ' 10er Minute Nord Dim Nme As Eram Byte ' einer Minute Nord Dim Nn1 As Eram Byte ' erste Nachkommastelle Dim Nn2 As Eram Byte ' zweite Nachkommastelle Dim Nn3 As Eram Byte ' dritte Nachkommastelle Dim Emz As Eram Byte ' 10er Minute Ost Dim Eme As Eram Byte ' einer minute Ost Dim En1 As Eram Byte ' erste Nachkommastelle Dim En2 As Eram Byte ' zweite Nachkommastelle Dim En3 As Eram Byte ' dritte Nachkommastelle Declare Sub Progmodus Declare Sub Zahl Declare Sub Speichern Portb = 1 ' Taster auf Ground schalten, so den Pullup Widerstand nutzbar Porta = 1 ' erstmal alles leuchten lassen! Wait 2 $eeprom ' eeprom-Variablen mit Werten füllen Nmz = &B00111111 Nme = &B00000110 Nn1 = &B01011011 Nn2 = &B01001111 Nn3 = &B01100110 Emz = &B01101101 Eme = &B01111100 En1 = &B00000111 En2 = &B01111111 En3 = &B01100111 $data ' Hier beginnt die Hauptschleife Do Porta = 0 ' Licht wieder ausknipsen -> nun soll es in die Subroutine gehen debounce Portb.0, 0, Progmodus Porta = Nmz Wait 1 Porta = Nme Wait 1 Porta = Nn1 Wait 1 Porta = Nn2 Wait 1 Porta = Nn3 Wait 1 Porta = Emz Wait 1 Porta = Eme Wait 1 Porta = En1 Wait 1 Porta = En2 Wait 1 Porta = En3 Wait 1 Loop End Sub Progmodus A = 0 $eeprom ' Aktivieren des Eeproms Eingang = 0 while portb.0 = 0 debounce portb.2 , 0 , Speichern , Sub debounce portb.1 , 0 , Zahl , Sub wend End Sub Sub Zahl If A = 0 Then Gosub P0 If A = 1 Then Gosub P1 If A = 2 Then Gosub P2 If A = 3 Then Gosub P3 If A = 4 Then Gosub P4 If A = 5 Then Gosub P5 If A = 6 Then Gosub P6 If A = 7 Then Gosub P7 If A = 8 Then Gosub P8 If A = 9 Then Gosub P9 A = A + 1 ' nach dem Schreiben hochzählen für die nächste Stelle End Sub Sub Speichern Select Case Eingang ' Wertezuordnung gem. Hochzählung von Eingang Case 0 : B = &B00111111 Case 1 : B = &B00000110 Case 2 : B = &B01011011 Case 3 : B = &B01001111 Case 4 : B = &B01100110 Case 5 : B = &B01101101 Case 6 : B = &B01111100 Case 7 : B = &B00000111 Case 8 : B = &B01111111 Case 9 : B = &B01100111 End Select Porta = B End Sub P0: $eeprom Nmz = B $data Return P1: $eeprom Nme = B $data Return P2: $eeprom Nn1 = B $data Return P3: $eeprom Nn2 = B $data Return P4: $eeprom Nn3 = B $data Return P5: $eeprom Emz = B $data Return P6: $eeprom Eme = B $data Return P7: $eeprom En1 = B $data Return P8: $eeprom En2 = B $data Return P9: $eeprom En3 = B $data Return Was sagt ihr dazu? So wie ich es sehe, springt das Programm nicht einmal in die Unterroutine, wenn Pinb.0 = 0 wo ist mein Fehler? Im Simulationsmodus von bascom scheint es jedoch zu funktionieren, wenn ich "händisch" die Werte manipuliere und im Schrittmodus das programm durchlaufen lasse. schon jetzt vielen Dank für eure Hilfe Jens
Ist zwar ASM, aber die Kommentare ersetzen den Programmablaufplan, erklären also den Algorithmus. http://www.hanneslux.de/avr/divers/pm24/index.html Ich hab's zu Demonstrationszwecken irgendwo auch mal in BASCOM gemacht, ich gehe nachher mal suchen, vielleicht finde ich es ja noch. ...
Der eine Widerstand ist Schwachsinn. Du brauchst für jedes Segment einen Eigenen. Die Schalter reichen, wenn diese nur nach Masse schalten. Blockkondensatoren an der Betriebsspannung fehlt. Die Resetbeschaltung fehlt.
Ein Sucht-Problem: - Wer sucht, der findet... ;-) Im Anhang ist der BASCOM-Quältext für die oben verlinkte Spielerei mit Tiny24 und dreistelliger Siebensegmentanzeige. Viel Spaß damit. ...
Lippi, Du hast vergessen, die Batterie zu bemängeln. ;-) Laut Schaltsymbolen sind da nämlich 6 Zellen drin, das ist etwas viel für einen AVR... Gruß Elbaufwärts ...
Hallo und vielen Dank für die schnellen Antworten. Ich muss mich erstmal in Ruhe mit den Programmen und deiner Schaltung auseinander setzen. Die übersteigt zum einen total mein derzeitiges Wissen und auch den Anforderungen. Aber man kann ja ruhig ein wenig weiter gehen ;) Ziel der Schaltung war eigentlich lediglich ein "einstellbares" 7-Segment-Modul, das als Station eines Nachtcaches (jaja, wieder mal die dummen geocacher ;)) herhalten soll. D.h. die vorhandene Schaltung soll mir erstmal die Programmierung des ATTinys näher bringen, überhaupt ersteinmal zu begreifen, wie ich es schaffe, Werte in den eeprom zu schreiben, die ich über - in diesem Falle, weil ich es einfach nicht besser weiß - drei Taster eintippe. Des weiteren ist auch der minimale Stromverbrauch entscheidend. Wenn ich bzgl. der verwendeten eagle-Bauelemente falsche Teile verwendet habe, so ging es mir nur darum, sachnell mal die Schaltung darzustellen. Ich glaube, dass ich vielleicht meine Frage im falschen Forum gestellt habe, oder? Wie gesagt, mir geht es jetzt auch und vor allem darum, warum das Programm nicht in die Sub-Routine springt, wenn ich den Schalter an Pinb.0 auf gnd setze! denoch vielen Dank für die bisherige Hilfe. ich werde mich auf jeden Fall noch mit deinem Projekt auseinander setzen. Schöne Grüße Jens
Du hast vergessen, die Ziehwiderstände an Port B zuzuschalten. DDRB=&B00000000 'alle Mann Eingang PORTB=&B11111111 'Ziehwiderstände zuschalten Versuche mal diesen hier: DEBOUNCE PINB.0,0,Progmodus,SUB Die Zuordnung zu den Pins stimmt auch nicht, denn das Display sitzt ja in Natura an Port A. Das mit dem Widerstand hatte ja Lippy schon gesagt. MfG Paul
> Du hast vergessen, die Ziehwiderstände an Port B zuzuschalten.
Muss er das, wenn er Taster mit Wechslern einsetzt, die in jeder Lage
sichere Pegel liefern??
~
Hallo, >Du hast vergessen, die Ziehwiderstände an Port B zuzuschalten. > DDRB=&B00000000 'alle Mann Eingang > PORTB=&B11111111 'Ziehwiderstände zuschalten ich habe doch mit " ... Portb = 1 ' Taster auf Ground schalten, so den Pullup Widerstand nutzbar Porta = 1 ' erstmal alles leuchten lassen! ... " die beiden Ports entsprechend auf Vcc gesetzt.(wobei der Kommentar von mir natürlich genau falsch herum ist: nicht auf Ground sondern Vcc) Warum stimmen die Pinzuordnungen nicht? Das verstehe ich nun nicht? Das Display ist eines mit einer gemeinsamen Kathode. Natürlich könnte/kann man über die Dimensionierung des Widerstandes diskutieren, aber es sollte doch ein gemeinsamer reichen? Warum denn nicht? Aber ich habe in einem anderen Forum gelesen, dass der debounce-Befehl erst dann in die Subroutine springt, wenn die Taste wieder losgelassen wird. Das würde jedoch meinem Gedanken/Vorhaben, mit gedrückter Taste die Werteeingabe vorzunehmen widersprechen. Schöne Grüße Jens
Ups, nun verstehe ich, warum die Pinzuordnung falsch ist! Nur im Kommentar falsch! Shit, wenn man so etwas nicht mit entsprechender Sorgfalt und ruhe macht, geht einfach zu viel daneben! o.k. muss das dann noch korrigieren. Danke für den Hinweis! Jens
> Muss er das, wenn er Taster mit Wechslern einsetzt, die in jeder Lage > sichere Pegel liefern?? Frage: Welchen Pegel liefern die Taster im Moment des Umschaltens?
gaste jens wrote: > ich habe doch mit > " > ... > Portb = 1 ' Taster auf Ground schalten, so den Pullup Widerstand nutzbar > Porta = 1 ' erstmal alles leuchten lassen! > ... > " > die beiden Ports entsprechend auf Vcc gesetzt.(wobei der Kommentar von > mir natürlich genau falsch herum ist: nicht auf Ground sondern Vcc) Und ich bezweifle, dass Portb = 1 alle Pins des entsprechenden Ports auf 1 setzt! > Warum stimmen die Pinzuordnungen nicht? Das verstehe ich nun nicht? Hast du ja schon rausgefunden > Das Display ist eines mit einer gemeinsamen Kathode. Natürlich > könnte/kann man über die Dimensionierung des Widerstandes diskutieren, > aber es sollte doch ein gemeinsamer reichen? Warum denn nicht? Wenn es dir egal ist, dass das Display wesentlich dunkler ist, wenn es eine 8 anzeigt als wie wenn es eine 1 anzeigt, dann reicht sicherlich auch ein einziger Widerstand. Siehs einfach mal so: Der Widerstand dimensioniert dir den Strom der fliessen wird auf einen fixen Wert. Diesen Strom muessen sich je nachdem wieviele Segmente eingeschaltet sind, eben ganau diese Segmente teilen. Bei einer angezeigten 1 teilen sich dann 2 Led diesen Strom, bei einer angezeigten 8 muessen sich aber 7 Led diesen Strom teilen. Klar dass dann irgendwas auf der Strecke bleiben muss. In deinem Fall: die Helligkeit > Aber ich habe in einem anderen Forum gelesen, dass der debounce-Befehl > erst dann in die Subroutine springt, wenn die Taste wieder losgelassen > wird. Dazu kann ich nichts sagen. Kenne Bascom zuwenig. Aber: Du solltest dich nicht in einem Forum umhören, sondern die Doku zu Bascom lesen. Da steht das nämlich sicherlich drinnen.
Willkommen zurück...
> Frage: Welchen Pegel liefern die Taster im Moment des Umschaltens?
Den, den die Leitung als in ihrem Nebenjob als Antenne einfängt. Bei
einer ordentlichen Entprellung (zyklische Abfrage und 4-Fach-Vergleich
nach PeDa) ist das irrelevant. Wie Debounce von BASCOM funktioniert,
habe ich mangels Interesse (an BASCOM) aber nicht recherchiert.
Gruß in die Berge...
~
Hallo Karl heinz Buchegger (kbuchegg) (Moderator) >Wenn es dir egal ist, dass das Display wesentlich dunkler ist, wenn es >eine 8 anzeigt als wie wenn es eine 1 anzeigt, dann reicht sicherlich >auch ein einziger Widerstand. das war mir schon klar und ich habe das nun leider nicht so deutlich ausgedrückt! Ja! Für die Anwendung (geocache) ist dies wirklich unwesentlich! Bei Nacht ist auch die Anzeige der 8 mit Punkt noch deutlich erkennbar. Mehr soll hier nicht erforderlich sein. Es geht ja auch um die Pflegeleichtigkeit. >Dazu kann ich nichts sagen. Kenne Bascom zuwenig. >Aber: Du solltest dich nicht in einem Forum umhören, sondern die Doku zu >Bascom lesen. Da steht das nämlich sicherlich drinnen. naja, ich finde diese Aussage in der Doku nicht. Lediglich dies ist zu finden und beschreibt ja den Debounce dem Grunde nach! "The DEBOUNCE statement tests the condition of the specified pin and if true there will be a delay for 25 mS and the condition will be checked again. (eliminating bounce of a switch) When the condition is still true and there was no branch before, it branches to specified the label. When the condition is not true, or the logic level on the pin is not of the specified level, the code on the next line will be executed." gruß Jens
>Und ich bezweifle, dass > Portb = 1 >alle Pins des entsprechenden Ports auf 1 setzt! Tschuldigung. Hatte vergessen darauf zu antworten: Bei Port B kann ich das nicht direkt sehen. Bei Port A -> 7-Segment-Display ist dies jedoch Fakt. Da der Port B lediglich 4 Bit hat, weiss ich nicht, wie sich das dann bemerkbar macht! Werde daher demnächst den Test mit den Pinsd durchführen.
Nööö, Portb=1 setzt nur Bit 0 im Port, willst Du alle Bits setzen, dann musst Du Portb=255 schreiben. ~
Hmmmm, das muss ich jetzt doch noch mal überprüfen! In den Beispielen des Bascom Manuals wird deine 255 durch diverse Beispiele bestätigt. Täusche ich mich da wirklich so sehr? Egal, könnte zumindest eine Fehlerquelle sein. Vielen Dank erstmal Jens
Dieser Fred zeigt doch wieder auf welch "hohem Niveau" die Bascommer sind. Kopfschütteln
>Dieser Fred zeigt doch wieder auf welch "hohem Niveau" die Bascommer >sind. >Kopfschütteln dein kommentar zeigt mal wieder, das auch dieses Forum nicht vor Trollen geschützt ist! Was soll so ein Schmarn? Ich hatte geschrieben, dass ich bisher noch nichts programmiert habe. Das ich ebenfalls bzgl. der Elektronik total unvorbelastet bin. Basic hat nun mal die Angewohnheit, eine Anfängersprache zu sein! Aber schön, dass du da einfach viel schlauer bist und keine Fehler machst! Freutm ich für dich. Und ich möchte mich bei allen anderen im Forum dafür entschuldigen, dass ich dem Troll wieder einmal Futter gegeben habe! Jens
> Was soll so ein Schmarn? > Ich hatte geschrieben, dass ich bisher noch nichts programmiert habe. > Das ich ebenfalls bzgl. der Elektronik total unvorbelastet bin. Vielleicht kleiner anfangen? Es bringt nix, den dritten Schritt vor dem ersten machen zu wollen und beim ersten unqualifitierten Kommentar gleich ruppig zu werden... ~
Schäme Dich, Junge! So'n großer Ker(e)l....;-) Vielleicht sollte man sich erst mal zur Entspannung einen vernünftigen Film ansehen?! http://www.youtube.com/watch?v=LMpmW4DTBi0 MfG Paul
gaste jens wrote: > Basic hat nun mal die Angewohnheit, eine Anfängersprache zu sein! räusper ... also Basic ist sicher eine sehr leicht zu erlernende Sprache, aber nicht nur eine Anfängersprache. Ich habe (als Auftragsarbeiten) schon sehr komplexe Anwendungssoftware in Basic (Visual Basic und .NET) geschrieben, sowie einige zehntausende Zeilen VBA (für 'ne Bank). Da ich in der Basic-Ecke recht gut klarkomme, war für mich auch Bascom Sprache der Wahl für meine AVRs, und ich habe es bislang nicht bereut. Das auch komplexere und hardwarenahe Dinge in Bascom möglich sind, zeigt z.B. der TCP/IP-Kram auf http://members.home.nl/bzijlstra/software/examples/RTL8019as.htm. Gruß Dominique Görsch
Nix gegen BASIC. Auf dem PC nutze ich auch BASIC. Auf dem AVR bevorzuge ich aber ASM, ist einfach eindeutiger und ressourcenschonender. Das hat vermutlich auch damit zu tun, dass meine ersten AVRs noch kein SRAM hatten und mir damals auch nur ASM (AVR-Studio) zur Verfügung stand. Ich plädiere bei Anfängern für ASM, weil sie damit die (aus PC-Sicht etwas gewöhnungsbedürftige) Architektur besser und schneller kennen lernen. Es gibt allerdings immer wieder Leute, die meinen, dass das Verwenden von BASCOM (BASIC ist ja "Kinderleicht") das Lesen von Datenblättern und anderen Dokumentationen erübrigt. Das trifft zwar für Jens nicht zu, ist aber hier oft zu finden. ~
Hallo Forum, noch einmal vielen Dank für die Hilfe und auch die (teilweise) berechtigte Kritik. Ich habe im Programm PortB.0 durch PinB.0 (und analog die anderen Pin) ausgetauscht und nun funktioniert es einwandfrei. D.h. ein paar Änderungen habe ich noch vorgenommen. Da ich mal wieder nichts hier dabei habe, kann ich das nun nicht mit anhängen. Falls Interesse besteht, werde ich die noch nachholen. Wenn man mit dem Programmieren mittendrin beginnt und sich auf seine (falschen) Interpretationen eines vorhandenen Programms verläßt führt das schnell auf den Holzweg! ;) Schöne Grüße Jens
> Ich habe im Programm PortB.0 durch PinB.0 ... ausgetauscht Tja, vielleicht hätte das Kapitel I/O im Datenblatt geholfen? Da gibt es auch eine Beschreibung der vorhandenen Register. Die AVRs haben nunmal getrennte Register für Eingang, Datenrichtung und Ausgang (PINx, DDRx, PORTx), und manche AVR-Ports haben noch ein weiteres Register zum Trennen des Digitalteils vom Pin (DIDRx). Programmieren bedeutet nunmal auch selbstständiges Lesen (und Verstehen) der Dokumentationen, ich halte es für unfair, sich jede Kleinigkeit von jemand Anderen erklären lassen zu wollen. Viel Erfolg weiterhin. - Und jag' den Kritikern (also auch mir) doch bunte farbkullern auf den Pelz, dann geht's Dir wahrscheinlich wieder besser... ;-) ~
>Tja, vielleicht hätte das Kapitel I/O im Datenblatt geholfen? Da gibt es >auch eine Beschreibung der vorhandenen Register. Die AVRs haben nunmal >getrennte Register für Eingang, Datenrichtung und Ausgang (PINx, DDRx, >PORTx), und manche AVR-Ports haben noch ein weiteres Register zum >Trennen des Digitalteils vom Pin (DIDRx). Das hat nichts mit dem Lesen des Datenblattes zu tun, sondern mit dem Verstehen der dort genannten Informationen. Ich hatte nicht verstanden, dass PortB.0 = 1eine andere Funktion hat als PinB.0 = 1, wo doch beide Male ein einzelner Pin des Ports angesprochen werden! Alles andere, was du dort nun gesagt hast, ist "kalter Kaffee", da es mir bekannt ist! >Programmieren bedeutet nunmal auch selbstständiges Lesen (und Verstehen) >der Dokumentationen, ich halte es für unfair, sich jede Kleinigkeit von >jemand Anderen erklären lassen zu wollen. Wenn man aber an einer Stelle hängen bleibt und nicht den Fehler entdecken kann, dann kann man natürlich noch jahrelang selbst weitersuchen, oder man fragt bei jemanden an, bei dem man hofft, das der weiter helfen kann. Aber das die Bereitschaft so gering ist/zu sein scheint, erstaunt mich! Und nochmals: so dann Anfänger abzuschrecken ist sicher nicht der beste Weg! Ihr vergesst, dass ihr auch irgendwann angefangen habt.
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.