Hallo zusammen, vielleicht hat jemand eine Idee für mich: Ich versuche gerade eine kleine Schaltung mit einem ATtiny13V zu programmieren. Dazu verwende ich AVR Studio 4 und einen mkII. Das erste Problem war, dass ich nur den ATtiny13A als Device im AVR Studio auswählen konnte. Es scheint aber auch so zu funktionieren. Kann ich irgendwie auch den ATtiny13V einbinden? Außerdem resetet sich der Controller etwa sekündlich, solange er an der Programmier-Schnittstelle hängt. Das hatte ich bei anderen Controllern bisher nicht. Kann jemand helfen?
Zumindest beginnt das Programm von vorn. Ich steuere mit 2 Pins einen Motortreiber an (L293) und lasse den Motor so erst in eine Richtung drehen und nach einem delay von 200ms in die andere. Nach 200ms sollte der Motor also nur noch in eine Richtung drehen. Verbunden mit dem PC fährt er aber immer hin und her.
1 | #include <avr/io.h> |
2 | #include <stdint.h> |
3 | #define F_CPU 1000000UL
|
4 | #include <util/delay.h> |
5 | |
6 | int main() |
7 | {
|
8 | DDRB = (1 << PB0); /* Output */ |
9 | PINB = (1 << PB0); /* internal Pullups */ |
10 | |
11 | DDRB = (1 << PB1); /* Output */ |
12 | PINB = (1 << PB1); /* internal Pullups */ |
13 | |
14 | PORTB=0x02; |
15 | _delay_ms(200); |
16 | PORTB=0x01; |
17 | |
18 | while(1) |
19 | {
|
20 | }
|
21 | return 0; |
22 | }
|
Wie hast du das verkabelt? Du solltest aufjedenfall mal testen ob die Spannung absackt, das Programm ist korrekt, ich würde daher auch den Fehler in der Hardware suchen.
Dass die Versorgung einbricht kann ich mir eigentlich gar nicht vorstellen, da die Stromquelle eine LiIon Zelle mit extrem geringem Innenwiderstand ist. Ich werde aber morgen mal die Spannung am Reset und die Versorgungsspannung am Oszi ansehen, zu Hause habe ich leider noch keines. Die Platine habe ich in Eagle erstellt und selbst geätzt. Tim schrieb: > MCUSR könnte die helfen. Das werde ich mir auch nochmal ansehen.
Hi,
> ... das Programm ist korrekt ...
Das ist Ansichtssache. Nach der vermutlich intendierten Funktion ist
es das nämlich nicht:
DDRB = (1 << PB0); /* Output */
PINB = (1 << PB0); /* internal Pullups */
DDRB = (1 << PB1); /* Output */
PINB = (1 << PB1); /* internal Pullups */
soll wohl eher
DDRB = (1 << PB0); /* Output */
PINB = (1 << PB0); /* internal Pullups */
DDRB |= (1 << PB1); /* Output */
PINB |= (1 << PB1); /* internal Pullups */
heißen.
Oder besser gleich
DDRB = (1 << PB0) | (1 << PB1);
PINB = (1 << PB0) | (1 << PB1);
--jmp
jmp schrieb: > Hi, > >> ... das Programm ist korrekt ... > > Das ist Ansichtssache. Nicht einmal das. Die Initialisierung ist einfach Müll. Georg schrieb: > DDRB = (1 << PB0); /* Output */ PB0 = Ausgang, PB1 = Eingang > PINB = (1 << PB0); /* internal Pullups */ Toggle PB0. Da PB0 nach Reset 0 war, ist es jetzt 1. Das ist aber kein internal Pullup, sondern der Ausgang ist jetzt HIGH. > DDRB = (1 << PB1); /* Output */ PB0 = Eingang, PB1 = Ausgang. > PINB = (1 << PB1); /* internal Pullups */ Toggle PB1. s.o. PB0 = Eingang, High PB1 = Ausgang, High Das Toggeln kann man sich zudem noch sparen, da der Ausgang und der Eingangs-Pullup ohnehim im Anschluss wieder geändert werden. > PORTB=0x02; PB1 = Ausgang, High; PB0 = Eingang, LOW > _delay_ms(200); > PORTB=0x01; PB1 = Ausgang, LOW; PB0 = Eingang, HIGH Irgendwie sinnlos. mfg.
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.