Ungewollter Reset

Gast #3516256
Lesenswert?

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?
Gast #3516321
Lesenswert?

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
}
Gast #3516464
Lesenswert?

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.
Gast #3516534
Lesenswert?

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
#3516558
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren