Forum: Mikrocontroller und Digitale Elektronik Attiny 45 Programmierung funktioniert nicht


von Konrad P. (Gast)


Lesenswert?

Hallo!

Eigentlich komme ich aus der Arduino - Ecke und programmiere meine 
Atmega 328s auch mit dessen IDE. Doch jetzt will ich mit meinem USBasp 
einen Attiny 45 Programmieren.
Das ganze soll eigentlich nur nach dem Drücken eines Tasters eine LED 
für rund 20 Minuten leuchten lassen - eigentlich nicht schwer. Und 
deswegen hab selbst ich das mit der "Bascom AVR" hingekriegt. Flashen 
mit Bascom bekomm ich nicht auf die Reihe (geht das überhaupt? ) und 
deswegen hab ich mir "KhazamaAVRProgrammer" heruntergeladen, was 
anscheinend extra für den USBasp gemacht ist. Zum flashen wird ein 
HEX-File das nach dem Kompilieren rauskommt verwendet.
Erst bekomme ich 2X hintereinander den Fehler "Error while Setting 
USBASP ISP Clock..." (den ich aber schon immer in der Arduino-IDE 
bekomme, dort gibt's keine Probleme), danach kommt "Reload FLASH 
file:[Pfad zur Datei]
Last EEPROM file not found
Erasing...
Writing FLASH..."
Drückt man auf OK landet man wieder im Programm.
1
$regfile = "Attiny45.dat"
2
$crystal = 1000000
3
$hwstack = 16
4
5
Config Portb.0 = Output
6
7
Config Portb.1 = Input
8
9
Dim Zahl As Long
10
11
Zahl = 1000000
12
13
Do
14
If Portb.1 = 1 Then
15
   Toggle Portb.0
16
   Waitms Zahl
17
18
End If
19
Loop

Das ist der Code. Ja, man könnte den Attiny in den Schlafmodus setzen, 
aber Strom ist in meinem Projekt das kleinste Problem.
Ist er wenigstens richtig? Bascom AVR zeigt mir keine Syntax-Errors.

Vielen Dank im voraus,
Konrad

von Karl M. (Gast)


Lesenswert?

Hallo Konrad,

ein Blick beim Bascom verrät Dir mehr zum waitms und dessen Parameter:

http://avrhelp.mcselec.com/index.html?waitms.htmhttp://avrhelp.mcselec.com/index.html?waitms.htm

von Konrad P. (Gast)


Lesenswert?

Erstmal danke für die Antwort!

Deswegen durfte ich auch nicht direkt 1000000 dahinterschreiben...
(Bin es beim Arduino halt mit der Funktion Delay so gewohnt.)
Jetzt hab ich Waitms durch Wait ersetzt und die Zeit entsprechend 
angepasst.
Funktionieren will der kleine aber immernoch nicht - wenn ich 5V auf Pin 
1 gebe bekomme ich keinen Output an Pin 0.

MfG Konrad

von Uwe (de0508)


Angehängte Dateien:

Lesenswert?

Hallo Konrad,

hier ist mal ein Programm unter LunaAVR[1] geschrieben, das sauber einen 
Tastendruck erkennt, dann eine LED einschaltet und einen Zeituhr mit 20 
Sekunden startet.

Nach Ablauf der 20 Sekunden Zeituhr wird die Led wieder gelöscht.

Man kann die Zeituhr immer wieder neu starten, indem man den Taster 
erneut drückt.

Der Taster muss von PB1 nach Masse schalten !
Die LED geht von PB0 -> Widerstand -> Kathode-LED-Anode -> Vcc (+5V) und 
leuchtet, wenn das Pin auf LOW ist.

[1] LunaAVR V2015 R1.6
# http://avr.myluna.de/doku.php?id=de:lunaavr_2015.r1

: Bearbeitet durch User
von Konrad P. (Gast)


Lesenswert?

Danke dass du dir so viel Mühe gemacht hast!!!

Bei dem Code blicke ich als "Noob" garnicht durch, Arduino ist schon 
viel simpler. Doch da liegt auch das Problem: Wie erweitere ich das 
ganze auf 20 Minuten (wie oben geschrieben) ? Einfach diese Zeile: "as 
TASKMGR_TIME_10MS( (n) *1000 )" anpassen?

MfG Konrad

von Konrad P. (Gast)


Lesenswert?

Irgendetwas mach ich falsch, es funktioniert immernoch nicht...

von Uwe (de0508)


Lesenswert?

Hallo Konrad,

Das ist ein Testprogramm für deinen µC.

Zum intern Ablauf: es wird also mit ~ 10ms gearbeitet, das folgt aus:

1MHz /64 /156 = 100,16Hz

Die Methode TaskMgr.TaskAdd( proc, 10ms_time_ticks ) verarbeitet 
|10ms_time_ticks| als 16 Bit Argumente.

Somit kann man maximal 65536 *10ms_time_ticks (~ 10ms) verzögern.
Daraus ergibt sich eine direkte Verzögerung von ca. 655 Sekunden.

Also anders gerechnet:
10 Minuten sind also
10 *60 *1000ms /10ms = 60.000 10ms_time_ticks.

D.h. die Procedure LED_Clear() muss noch einen Zähler mit führen, um 
erst nach dem zweiten Aufruf |LED = LED_OFF| aus zu führen.

Also noch fix ein weiters Macro geschrieben:
1
' TaskMgr-Definitionen
2
#define TASKMGR_TIME_MIN(n)    as TASKMGR_TIME_SEC( (n) *60 )
3
#define TASKMGR_TIME_SEC(n)    as TASKMGR_TIME_10MS( (n) *1000 )
4
#define TASKMGR_TIME_10MS(n)  as word( (n) /TASKTIMER_TIMESLICE )

Die Main-Loop angepasst:
1
' add new Task
2
TaskMgr.TaskAdd( LED_Clear().Addr, TASKMGR_TIME_MIN(10) )

Und die Procedure LED_Clear() erweitert:
1
procedure LED_Clear()
2
dim state as static byte ' variable will all init to 0
3
4
incr state
5
select case state
6
case 1
7
' re add Task
8
TaskMgr.TaskAdd( LED_Clear().Addr, TASKMGR_TIME_MIN(10) )
9
10
case 2
11
state = 0
12
LED = LED_OFF
13
endselect
14
endproc

: Bearbeitet durch User
von Konrad P. (Gast)


Lesenswert?

Nur dass ich das ganze hier richtig verstanden hab: Ich muss Pin 1 
einfach auf Masse schalten und es sollte funktionieren? Langsam denke 
ich dass mein uC defekt ist...

von Uwe (de0508)


Lesenswert?

Hallo Konrad,

die Bedingungen für mein Testprogramm, habe ich alle in diesem Beitrag
Beitrag "Re: Attiny 45 Programmierung funktioniert nicht"
beschrieben.

von Paul B. (paul_baumann)


Lesenswert?

Ich verstehe den TO so, daß es nicht an den Programmen (Quelltexten) 
liegt, sondern daß sich der Kontroller nicht programmieren läßt, es also 
ein elektrisches bzw. elektronisches Problem ist.

Aus Bascom heraus kann ich hier mit einem sog. "Avrdoper" ohne 
Schwierigkeiten alle möglichen Kontroller ansprechen. USBASP habe ich 
nicht.

mfG Paul

von Konrad P. (Gast)


Lesenswert?

Mein Attiny wird dann wohl defekt sein... (obwohl unbenutzt und erst von 
ein paar Stunden aus seiner Anti-ESD Tüte rausgenommen)
Deswegen kommt jetzt ein Atmega 328 zum Einsatz, auch wenn dieser extrem 
überdimensioniert ist.

Trotzdem Danke für eure Hilfe.

MfG Konrad

von Walter S. (avatar)


Lesenswert?

Konrad P. schrieb:
> Ist er wenigstens richtig?

nein, nach wait willst du die LED ausschalten,
dann mach das doch auch

von Bastian W. (jackfrost)


Lesenswert?

Hi,

Lies den attiny45 mal aus und schau dir das hex File an ob das mit dem 
das du programmiert hast gleich ist.

Gruß JackFrost

von Tom (Gast)


Lesenswert?

Konrad P. schrieb:
> Erst bekomme ich 2X hintereinander den Fehler "Error while Setting
> USBASP ISP Clock..."

Die chinesischen USBASP haben oft keine aktuelle Firmware.
Bei avrdude z.B. wird dann die Option -B für die Reduzierung
des ISP Clock nicht unterstützt.
Abhilfe: bei Fischl.de die aktuelle Firmware holen.
Du brauchst einen zweiten ISP Programmer, um die Software
auf den USBASP zu bringen. Evtl. Arduino as ISP duzu verwenden.

von Tom (Gast)


Lesenswert?

Typo: duzu = dazu ;-)

von Konrad P. (Gast)


Lesenswert?

Beim Auslesen treten auch Fehler auf, also liegts wahrscheinlich am 
USB-ASP.

Naja, jetzt werkelt auf jeden Fall ein Atmega 328 im Nachtlicht - zwar 
Verschwendung, aber ich habe sowieso genügend davon :)

PS: Einen Arduino habe ich übrigens nicht :)

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.