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.
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
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.