Forum: Mikrocontroller und Digitale Elektronik Attiny mit komischem verhalten


von Florian I. (fbeek)


Lesenswert?

Hi Leute,

also ich bin im moment echt am verzweifeln.

Und zwar habe ich hier einen ATTIny 13 der an einem Eingang ein High 
Wert erkennen soll um dann eine LED einzuschalten und ein bestimmten 
Wert per Ausgang an einen ATMEGA 32 auszugeben. Das ist aber nicht so 
wichtig.

Der Tiny Liegt in der Grundbeschalten vor:

-Abblockkondensator zwischen GND und VCC
-3,3V VCC
-intern erzeugte 4,8 MHZ
-LED wie um Tutorial beschrieben verschaltet

Zum Testen habe ich einfaches Programm geschrieben, welches erstmal nur 
die LED einschaltet wenn wenn ein High Wert anliegt.

Code:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>

int main (void)
{
  DDRB |= (1<<PB2);
  PORTB |= (1<<PB2);
  while (1)
  {
           if ( PINB & (1<<PINB3) )
           {
              PORTB &= ~(1<<PB2);
           }
           else
           {
              PORTB |= (1<<PB2);
           }
  }
  return 0;
}

Das Problem ist nun, dass es einfach nicht klappen will(das Flashen 
Funktiniert ohne Probleme).

Schalte ich VCC ein so ist die LED aus wie es sein soll.
Lege ich nun aber an PB3 VCC an als Logisches Hight so passiert entweder 
nichts oder die LED geht.Das soll sie ja auch.Aber setze ich den Port 
nun auf GND sollte sie ja sofort ausgehen aber das Problem ist,dass dies 
erst ein paar sekunden Später passiert.Ausser dem flackert die LED wenn 
ich an die Pinleiste berühre die zu den Ports für die Programmierung 
führt.

Habe die Schaltung schon 3 mal neu aufgebaut, überprüft(Spannungen 
gemessen, Lötstellen etc.) und es auch schon mit Interrupts versucht was 
auch nicht funktioniert da komischerweise Am Betreffenden INT0 Port 
immer VCC anliegt obwohl DDRB und PORT für diesen Pin auf 0 stehen.

Der Controller ist auch in ordnung ,da ich 5 Stück auf den 
Unterschiedlichen Platinen getestet habe.

Vielleicht habt ihr ja eine Idee

PS: Hab och eine kleine Frag. Und zwar habe ich hier noch einen Tiny 
welchen ich ausversehen auf 128 KHZ getacktet habe und in nun nicht mehr 
per Pony Prog ansprechen kann.Eventuell hat dazu auch jemand eine idee 
was aber nebensache ist.

Gruss
Florian

von Michael H* (Gast)


Lesenswert?

kann es sein, dass dein isp steckt, während du testest?

mit was legst du den port auf high? massen zur "high"-spannung und zur 
V_cc des tiny sind verbunden?

von Fabian S. (jacky2k)


Lesenswert?

2 Tipps: Wozu die beiden Includes?
>#include <avr/interrupt.h>
>#include <stdint.h>

Wie hast du die LED angeschlossen? Hoffentlich über nen Transistor oder 
Widerstand? Keine Ahnung wie viel die Beine des Tiny aushalten, aber bei 
nem atmega8 sinds ja schon nur 20mA...nicht das er immer resettet wird 
oder so, wenn die LED angeht.
Hast du mal die Optimierung beim Kompilieren ausgeschaltet? Vielleicht 
hilft das :D
Hatte ich auch schon, dass er mir irgendwas wegoptimiert hat was aber 
eigentlich so sein sollte.

von Florian I. (fbeek)


Lesenswert?

Nein ISP Steckt nicht.
Ja die Massen sind verbunden.
Habe es mit einem Abgriff von VCC zum pin versucht und mit einem zweiten 
Labornetzteil.

Die includes hatte ich vergessen raus zunehnem :-)
Die LEDs sind per 1k Widerstand angeschlossen wie im AVR TUT.

An der Optimierung sollte es nicht liegen die is aus ;-D

von Chris L. (kingkernel)


Lesenswert?

Passen denn auch die Fuse-Bits? Nicht das du auf Externer RC statt 
interner gestellt hast oder so.

Funktioniert ein anderes Programm denn auf diesem Chip?

von Michael H* (Gast)


Lesenswert?

@Fabian S.:
> Wie hast du die LED angeschlossen? Hoffentlich über nen Transistor oder
> Widerstand?
entweder, oder?
egal, es geht problemlos direkt mit widerstand.

> Keine Ahnung wie viel die Beine des Tiny aushalten, aber bei
> nem atmega8 sinds ja schon nur 20mA...nicht das er immer resettet wird
eine led verkraftet auch nicht viel mehr, falls überhaupt. außerdem sagt 
das avr-tutorial 1k.
wie viel strom steht im datenblatt. außerdem resettet der controller 
nicht, er geht einfach mit der spannung in die knie.
im datenblatt ist die augangsstufe zu finden.

> oder so, wenn die LED angeht.
> Hast du mal die Optimierung beim Kompilieren ausgeschaltet? Vielleicht
> hilft das :D
soll die while(1) wegfallen? also bitte, bei so einem progrämmchen...

@Florian Idb (fbeek):
wie schaut denn deine platine aus? bist du dir sicher, dass du an B3 
bist? dass die led flackert, wenn du an die isp leisten fasst, ist 
praktisch normal, weil B3 ja zur ISP gehört.
legt den verdacht nahe, dass du mit deiner "high"-spannung nicht an B3 
gehst.

von Florian I. (fbeek)


Lesenswert?

Moin Leute,

so hab mich gerade wieder drangesetzt.

Also die Fuses sind ok.

Was auch komisch ist das die LED ausegeht sobald ich GND egal an welcher 
stelle berühre.

Hab mein Voltmeter an GND geklemmt und sobal ich + am Volmeter berühre 
flackert die LED auch .

Nur zur Info PB3 gehört nicht mehr zum ISP :-)

von Florian I. (fbeek)


Lesenswert?

Sorry hatte noch vergessen zu erwähnen das die LED nun auch leutetwenn 
kein HIGH anliegt. Allerding schwächer als normal.

von Peter D. (peda)


Lesenswert?

Florian Idb wrote:
> Also die Fuses sind ok.

Kann ja jeder sagen.

Kost aber nix, es zu prüfen.
Also einfach ne Schleife mit LED togglen und _delay_ms(1000); drin und 
dann die Zeit prüfen.


> Was auch komisch ist das die LED ausegeht sobald ich GND egal an welcher
> stelle berühre.

Das ist zu 99,9% ein offener Eingang.
Vielleicht das Beinchen abgeknickt?


Peter

von Michael H* (Gast)


Lesenswert?

Michael H* wrote:
> @Florian Idb (fbeek):
> legt den verdacht nahe, dass du mit deiner "high"-spannung nicht an B3
> gehst.

von Mike (Gast)


Lesenswert?

Kalte Lötstelle?
Mal direkt am Pin PB3 die Spannung gemessen?

von P. S. (Gast)


Lesenswert?

Mach doch mal ein paar Bilder...

von Hannes (Gast)


Lesenswert?

_delay_ms(1000) kannst Du vergessen. Dem geht nicht.

Vergiss mal Deine Schleife.

Probier mal:

int main (void)
{
  DDRB |= (1<<PB2);
  PORTB &= ~(1<<PB2);
  return 0;
}

bzw.

int main (void)
{
  DDRB |= (1<<PB2);
  PORTB |= (1<<PB2);
  return 0;
}

von Peter D. (peda)


Lesenswert?

Hannes wrote:
> _delay_ms(1000) kannst Du vergessen. Dem geht nicht.

Das muß dann schon aber ein GCC ganz tief aus der Mottenkiste sein.

Ab WINAVR 20071221 und neuer geht das.


Peter

von Hannes (Gast)


Lesenswert?

Danke für den Hinweis, Peter.

Hab's grad nachgelesen.

von Fabian S. (jacky2k)


Lesenswert?

@Michael:
>außerdem resettet der controller
>nicht, er geht einfach mit der spannung in die knie.
Joa und wenn der Brown-Out an ist geht er aus...
Evtl steht der Brown out auch auf 4,5 oder was das war und er geht erst 
garnicht richtig an, weil er ja nur 3,3 hat?

Mhh ne, war das Brown-Out? Dises BODEN Flag meine ich :D

von User N. (panzerkeks) Benutzerseite


Lesenswert?

Probier mal den internen PullUp Widerstand für deinen Pin zu aktivieren.
1
DDRB &= ~(1<<PB3); //PB3 als Input
2
PORTB |= (1<<PB3); //internal Pullup an PINB3 aktivieren

von Michael H* (Gast)


Lesenswert?

Fabian S. wrote:
> @Michael:
>>außerdem resettet der controller
>>nicht, er geht einfach mit der spannung in die knie.
> Joa und wenn der Brown-Out an ist geht er aus...
nein... er geht mit der spannung am ausgang in die knie. die pins haben 
eine strombegrenzung. bis du da ordentlich strom durch den controller 
bekommst, müsstest du schon mehrere ports parallel schalten...

von Fabian S. (jacky2k)


Lesenswert?

Mhh ok...

von nullahn (Gast)


Lesenswert?

Für mich klingt das nach Parasitärer Versorgung durch Portpins.
Irgendwo schlecht gebraten.

Wie sieht den die Hardware aus Beschreibung oder Photo.

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