Forum: Mikrocontroller und Digitale Elektronik attiny24 und 7 Segmentanzeige


von gaste jens (Gast)


Angehängte Dateien:

Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Matthias L. (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

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.

...

von Hannes L. (hannes)


Lesenswert?

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

von gaste jens (Gast)


Lesenswert?

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

von Paul Baumann (Gast)


Lesenswert?

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

von Sinusgeek (Gast)


Lesenswert?

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

~

von gaste jens (Gast)


Lesenswert?

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

von gaste jens (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von gaste jens (Gast)


Angehängte Dateien:

Lesenswert?

was haltet ihr vom beiliegenden Proggy?

von Sinusgeek (Gast)


Lesenswert?

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

~

von gaste jens (Gast)


Lesenswert?

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

von gaste jens (Gast)


Lesenswert?

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

von Sinusgeek (Gast)


Lesenswert?

Nööö, Portb=1 setzt nur Bit 0 im Port, willst Du alle Bits setzen, dann 
musst Du Portb=255 schreiben.

~

von gaste jens (Gast)


Lesenswert?

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

von Compiler Error (Gast)


Lesenswert?

Dieser Fred zeigt doch wieder auf welch "hohem Niveau" die Bascommer 
sind.
Kopfschütteln

von gaste jens (Gast)


Lesenswert?

>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

von Sinusgeek (Gast)


Lesenswert?

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

~

von Paul Baumann (Gast)


Lesenswert?

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

von Dominique G. (dgoersch)


Lesenswert?

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

von Sinusgeek (Gast)


Lesenswert?

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.

~

von gaste jens (Gast)


Lesenswert?

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

von Sinusgeek (Gast)


Lesenswert?

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

~

von gaste jens (Gast)


Lesenswert?

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

von Sinusgeek (Gast)


Lesenswert?

> "kalter Kaffee"

Du hast recht und ich mei Ruh'...

~

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
Noch kein Account? Hier anmelden.