• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Ttiny45

Shepman

Geocacher
Hi,

bin gerade dabei ein kleines Programm für den Ttiny13 geschrieben. Speicher = 99% voll - läuft aber soweit einwandfrei. Da das Programm erst zur Hälfte fertig, hab ich aus Platzgründen das gleiche Programm (eigentlich nur $crystal auf 100000 geändert) auf dem 45er laufen lassen. Hab ein LDR (am Adc2) als Auslöser. Den Adc bekomme ich aber nicht zum laufen denn dort schein immer nur 0 ausgegeben zu werden.
Wisst ihr ob es Unterschiede beim adc von 13 und 45 gibt?

Grüße,

Alex
 

Windi

Geoguru
Ja es gibt Unterschiede. Wirf einfach mal einen Blick in die entsprechenden Datenblätter.
Das ADMUX-Register hat beim 45er mehr Optionen als beim 13er.
Mit welchem Compiler arbeitest Du denn? Mit Bascom?
Hast Du auch den korrekten Chiptyp im Sourcecode stehen?
 
OP
S

Shepman

Geocacher
Das stimmt, der 45er hat mehr Optionen aber die Register werden doch von der Definitionsdatei gesteuert (ja, ich hab ATtiny45.dat genommen und benutze Bascom)?
Ich lese ja im Prinzip nur den entsprechenden Multiplexer-Kanal aus (in meinem Fall getadc(2)) - funktioniert irgendwie nicht. Hab auch schon mal einen anderen 45er drauf gehabt, da er vielleicht ne Macke hat. Hat aber genausowenig gebracht. Ebenso hab ich es mal mit nem anderen Komparatoreingang versucht - auch nix.
Ich stelle mich vielleicht etwas doof an - sind schließlich meine ersten Gehversuche mit Atmel.
 
OP
S

Shepman

Geocacher
Ja, wie gesagt, auf dem 13er geht´s ohne Probleme und die Schaltung ist die Gleiche nur der uC ist ausgewechselt.
 
OP
S

Shepman

Geocacher
Für alle die es interessiert, ich hab die Lösung gefunden. Warum die allerdings funktioniert weiß ich auch net. Von Windi hab ich den Hinweis bekommen nach dem Start des Adc 100ms zu warten bis sich alles eingeschwungen hat - hat leider nichts geholfen. Ich hab dann ein bisschen rumprobiert und mehr oder weniger aus Verzweiflung nach dem Auslesen des Ldr mal 100ms gewartet - jetzt geht´s. :D :D :D

Hier nochmal der Beispielcode auf dem 45er:

Code:
$regfile = "ATtiny45.DAT"
$crystal = 1000000                                          'Frequenz des internen Oszillators

$hwstack = 28                                               'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen


Config Adc = Single , Prescaler = Auto
Config Portb = &B00001000                                   'Pinb.3 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = 0                                                   'Ausgänge auf Low setzen
                                                   'A/D-Wandler starten                                                   'Analog-Komparator abschalten, um Strom zu sparen

Const Schwelle = 50                                         'je größer der Schwellwert, desto unempfindlicher
Const Tagschwelle = 800                                     'Schwellwert für Schlafmodus
Const Zwangsimpuls = 8                                      'LED-Impuls tagsüber alle X Schlafyklen (á ca. 8 Sekunden)

Dim A As Byte                                               'Variablen definieren
Dim Tagzaehler As Byte
Dim Schlafzaehler As Byte
Dim Ldr As Integer                                          '0 = Dunkel, 1023 = Hell
Dim Alt As Integer
Dim Merker As Integer

Do

Start Adc
'Waitms 100
Ldr = Getadc(2)                                             'Helligkeitswert einlesen
Waitms 100
Stop Adc                                                    'A/D-Wandler zum Stromsparen wieder stoppen
Merker = Ldr - Alt                                          'Unterschied zwischen letzter und aktueller Messung ermitteln
Alt = Ldr                                                   'letzten LDR-Wert sichern
If Merker > Schwelle Then Gosub Blinken                     'Bei großer Änderung Dunkel->Hell: Blinken
If Ldr > Tagschwelle Then                                   'prüfen ob helligkeit über tagschwelle liegt
   If Tagzaehler < 255 Then                                 'int-variable geht nur bis 255
      Tagzaehler = Tagzaehler + 1
   End If
Else
   Tagzaehler = 0                                           'wenn wieder dunkel tagzähler löschen
End If

Loop


Blinken:                                                    'LED blinken lassen
For A = 0 To 10
  Portb.3 = 1
  Waitms 100
  Portb.3 = 0
 Waitms 100
Next B
Alt = 1023                                                  'Doppelauslösung verhindern
Return

End
 

waste1

Geocacher
Hallo

Ich hatte das gleiche Problem mit dem Tiny45. Scheinbar ist da noch ein Bug in Bascom. Mein Workaround war, den Befehl Getadc(2) mit manuellen Befehlen zum Auslesen des ADC zu ersetzen. Siehe Codefenster
Code:
Admux = &B00000010                                          'Channel 2 für ADC
'Ldr = Getadc(2)                                             'Getadc geht nicht
Adcsra = &B11000000                                         'startet ADC und Messung
Do
Loop Until Adcsra.6 = 0                                     'warte bis Messung fertig
Lb = Adcl                                                   'Helligkeitswert einlesen
Ldr = Adch
Shift Ldr , Left , 8
Ldr = Ldr + Lb
Stop Adc                                                    'A/D-Wandler zum Stromsparen wieder stoppen

Gruß
Waste1
 

Swunn

Geocacher
Wie jetzt? Mit dem Programm ist der Tiny13 zu 99% voll? Was baut Bascom eigentlich sonst noch so nebenbei da rein, 'nen DVD-Player? Und dann die ganzen Warteschleifen, da kann man ja nebenbei noch Seti rechnen. :shock:

Da lob ich mir ein ordentliches Assembler-Programm...

Sven
 
Oben