AVR Programm starten ohne HW-Reset

funzel

Neues Mitglied
23. Sep. 2009
5
0
0
Sprachen
Hallo,

Mit einen Attiny13 betreibe ich über die PWM eine Konstantstromquelle. Nun soll das Programm loslaufen, ohne dass ich noch einen Harware-Reset durchführen muss (z.B. über eine Taster den Reset-Eingang auf GND ziehen). Das heißt mit dem Anlegen der Spannungsversorung und ohne externes Eingreifen soll das Programm im Attiny13 anlaufen.

Welche Möglichkeit habe ich ohne extrenen Hardware-Reset einen Programmstart auszulösen?

Vielen Dank im Voraus!

Gruß

Finzel
 
Hallo,

Nun soll das Programm loslaufen, ohne dass ich noch einen Harware-Reset durchführen muss (z.B. über eine Taster den Reset-Eingang auf GND ziehen). Das heißt mit dem Anlegen der Spannungsversorung und ohne externes Eingreifen soll das Programm im Attiny13 anlaufen.

Welche Möglichkeit habe ich ohne extrenen Hardware-Reset einen Programmstart auszulösen?
der AVR erzeugt von sich aus einen Reset wenn man die Betriebsspannung
einschaltet. Das muß so sein damit man im inneren definierte Zustände
erhält und die digitale Welt nicht Amok läuft. Dafür hat er eine interne
Reset-Schaltung. Schau mal ins Datenblatt. Du benötigst also nicht unbedingt
eine externe Reset-Beschaltung. Aber sicherheitshalber macht man es
immer.

Du solltest aber AUF KEINEN FALL den Reset-Pin über die Fuses als normalen
I/O-Pin schalten. Sonst programmierst du den Tiny über SPI nur ein einziges
Mal.

Gruß
Dino
 
Hallo Dino,

zunächst vielen Dank für eine Antwort. Allerdings möchte ich anmerken dass ich mich mit einer Frage im Forum um eine Antwort bemühe die mehr aussagt als einem Blick ins Datenblatt zu werfen. Denn das hilft mir leider nicht weiter.

Gibt es die Möglichkeit den ATtiny13 ohne HW-Reset zu Programmanlauf zu bringen?

Vielen Dank im Voraus!

Gruß

Funzel
 
Hallo TSE,

hast Du Erfahrungen mir dem WatchDog? Folgend mein kleines Programm. Wie müsste ich da den Watchdog einbauen?

Code:
#include <avr/io.h>

void main (void)
{
      int A=39;
       int n;
    int f1;
    int f2;
  while (1)
  {
  f1 = (  PINB & (1<<PINB4));
  f2 = (!(PINB & (1<<PINB4)));
    
      if (f1)
        {
        if (A<250)
        {
            for (n=0;n<300;n++);
            A++;
        }
    }
    if (f2)
        {
        if (A>60)
        {
            for (n=0;n<300;n++);
            A--;
        }
    }
           DDRB = (1 << PB0 );    
    TCCR0A = 0x83;
    TCCR0B = 2;
    OCR0A = A;
  }
  return 1;
}
Vielen Dank im Voraus!

Gruß

Funzel
 
Hallo Funzel,

an der Stelle, an der du einen richtigen Reset ausführen möchtest, musst du nur den Watchdog aktivieren. Hierzu musst du die Bits WDTON und WDE im Register WDTCR setzen und danach in eine Endlosschleife gehen. Wenn der Watchdogtimer überläuft, wird ein Reset ausgeführt. Weitere Informationen findest du im Datenblatt im Kapitel <System-Control and Reset/Watchdog Timer>

Wenn du Code postest, bitte dafür den Code-Einfügen Button nutzen, der Beitrag wird so übersichtlicher, ich ändere das mal in dem Beitrag, ok.
Ich habe den Thread auch mal von AVR-PRAXiS-News verschoben nach AVR-Software Forum.

Gruß,
Dirk
 
Hallo Funzel,

zunächst vielen Dank für eine Antwort. Allerdings möchte ich anmerken dass ich mich mit einer Frage im Forum um eine Antwort bemühe die mehr aussagt als einem Blick ins Datenblatt zu werfen. Denn das hilft mir leider nicht weiter.

Tiny13-Reset.png
Hier siehst du den internen Aufbau der Reset-Schaltung im Tiny13 (aus dem
vollständigen Datenblatt - nicht das Summary).
Wie mann oben in den zwei Blöcken "Power-on Reset Circuit" und
"Brown-out Reset Circuit" erkennen kann führt er zwangsläufig einen HW-Reset
aus wenn du den Strom anstellst. Der Reset-Pin kann optional einen HW-Reset
von außen verwalten. Also ist es ihm absolut egal ob du den Strom anstellst
oder auf nen Taster drückst der am Reset-Pin hängt oder ob du unter die
Spannungsschwelle kommst (2,5V?) die über die Fuses für den Brown-Out
eingestellt sind. Er führt in allen drei Fällen einen Hardware-Reset aus.

Gibt es die Möglichkeit den ATtiny13 ohne HW-Reset zu Programmanlauf zu bringen?
Nein!
Wenn Du einfach nur den Strom andrehen könntest ohne das ein Reset einen
definierten Anfangszustand erzeugt, könnte es zB vorkommen das dein
Programmcounter irgendwo mitten im Flash anfängt irgend etwas auszuführen
was evtl kein Programm sondern Datenbereich ist. Das weiß der Prozessor
aber nicht. Ihm ist es egal was er da vor die Nase bekommt. Er liest es und
versucht es auszuführen. Und wenn es nur Grütze ist dann ist das dein
Problem ;) Warum schreibst du auch gerade Daten da hin wo er anfangen
möchte mit seiner Programmausführung :rolleyes:

Also kurz und gut ... Du MUSST einen Reset erzeugen (egal wie) damit der
Prozessor einen definierten Anfangszustand bekommt wenn der Strom
eingeschaltet wird. Sonst läuft die Hardware Amok (punkt).

Und wenn das Programm abstürzt dann gibt es dafür den externen Reset-Taster
und den Watchdog-Timer. Die führen aber auch einen Hardware-Reset aus.

Gruß
Dino
 
Hallo Dino,

angenommen ich setzte in einem Programm nur einen Ausgang z.B. den PB0. An diesen Ausgang schließe ich eine LED an. Nun nehme ich die Spannungsversorgung des ATtinys kurz weg und schließe diese wieder an. Müsste dann die LED ohne den Reset-Eingang auf GND zu legen wieder angehen?
---
In meinem Fall muss ich immer nach dem kurzzeitigen Abziehen der Spannungsversorgung den Reset-Eingang auf GND legen, dass die LED wieder an geht. Und ist das normal??

Gruß

Dierk
 
Hallo Dierk,

(mit ie ? oder Schreibfehler?)

angenommen ich setzte in einem Programm nur einen Ausgang z.B. den PB0. An diesen Ausgang schließe ich eine LED an. Nun nehme ich die Spannungsversorgung des ATtinys kurz weg und schließe diese wieder an. Müsste dann die LED ohne den Reset-Eingang auf GND zu legen wieder angehen?
wenn du an PB0 eine LED anschließt und die anschalten willst, muß im DDRB
das Bit0 auf 1 sein (Ausgang). Je nachdem ob du jetzt die LED nach GND oder
+5V schaltest muß im PORTB das Bit0 auf 0 oder 1 sein um sie zum leuchten
zu bringen.
Wenn die Spannung jetzt kurzzeitig ausfällt, setzt die interne Power-On-Reset
Schaltung den Prozessor zurück und damit sind die Register alle mit Nullen
gefüllt. Dadurch wird PB0 automatisch auf Eingang geschaltet und die LED ist
aus. Einschalten geht nur, wenn du sie im Programm, das dann anfängt zu
laufen, wieder anschaltest (DDRB0=1 und PORTB0 entsprechend setzen).
Geht also leider nicht was du da vorhast. Selbst wenn die Programmierung
über SPI abgeschlossen ist wird der Prozessor automatisch zurückgesetzt.

In meinem Fall muss ich immer nach dem kurzzeitigenzt Abziehen der Spannungsversorgung den Reset-Eingang auf GND legen, dass die LED wieder an geht. Und ist das normal??
Ich würde mal sagen ... undefinierte Spannungspegel bei der Betriebsspannung.
Evtl fällt die Spannung durch Elkos zu langsam in sich zusammen.
Stell mal den Brown-Out über die Fuses auf nen anderen Wert und den
Timeout nach dem Reset auch länger machen. Weißt du was ich damit
meine ?

Die Betriebsspannung fällt nicht weit genug zusammen um die interne
Rest-Logik auszulösen und der Prozessor kommt dadurch in einen
undefinierten Zustand weil die Registerwerte sich bei der niedrigen
Spannung wohl teilweise verändern (Bits gehen verloren) und der AVR
dadurch Amok läuft. Das ist das, was ich weiter oben schon mal beschrieben
habe.

EDIT : Fällt mir grade noch ein ... evtl läuft der Oszillator des AVR nach
dem Spannungsausfall und Reset nicht sauber an. Dann hat er zwar nen
definierten Zustand aber an dem ändert sich auch nix mehr weil er nicht
weiterläuft :D

Gruß
Dino
 
Also Dino noch mal.

Ich deklariere eine Variable z.B. A. Diese Variable definiere ich im Hauptprogramm mit 1, also A=1. Dann weise ich in der While-Schleife mit dem Befehl if (A) den Ausgang zu.

1) Wenn jetzt das Programm gestartet wird, geht dann der Ausgang auf eins?
2) Und wenn ich dann die Spannungsversorgung kurz abziehe und wieder anstecke, wird dann der Ausgang wieder eins?

Kann mir jemand die Frage 1) und 2), also so wie die Fragen gestellt werden,ohne Unerstellung beantworten.

Gruß

Funzel
 
Hallo,

Also Dino noch mal.

Ich deklariere eine Variable z.B. A. Diese Variable definiere ich im Hauptprogramm mit 1, also A=1. Dann weise ich in der While-Schleife mit dem Befehl if (A) den Ausgang zu.

1) Wenn jetzt das Programm gestartet wird, geht dann der Ausgang auf eins?
2) Und wenn ich dann die Spannungsversorgung kurz abziehe und wieder anstecke, wird dann der Ausgang wieder eins?

Kann mir jemand die Frage 1) und 2), also so wie die Fragen gestellt werden,ohne Unerstellung beantworten.
hä ? :confused: Bratkartoffeln ? :confused:
Was hat eine Variable damit zu tun das ein Ausgang angeschaltet wird ?
Das wär so als ob die Tür zugeht nur weil du die Wand daneben gelb
anstreichst.

Im Moment versteh ich nur noch Bahnhof ...

- Wie sieht dein Programm aus ? Stell es hier mal rein ...
- Wie sieht deine Schaltung aus ? Mach mal nen Schaltplan
(abfotografieren, mit EAGLE zeichnen, was weiß ich, ...)
- Was hast du für Vorkenntnisse ? (Keine falsche Scham ...)

Ich weiß im Moment nicht mehr wie ich dir helfen kann oder dir irgendwas
weiter erklären kann.

Und das mit dem Unterstellen versteh ich auch nicht ... Die Leute möchten
dir hier weiterhelfen. Es wird aber schwer dir etwas zu erklären wenn man
nicht genau weiß wie groß dein Wissen bereits ist und was du da schon
zusammenprogrammiert und zusammengelötet hast. Wenn du irgendwo
Probleme mit dem Verständnis oder irgendwo noch Lücken hast dann wird
dich keiner auslachen. Es nützt aber keinem, wenn du nicht sagst wenn es
noch irgendwo Probleme mit dem Verständnis gibt. Wir erklären uns den Wolf
und bei dir kommt es nicht an. Und im Internet sitzt man dem jenigen leider
nicht gegenüber um zu sehen wo es noch hakt.

Durch so etwas gabs hier schon mal ne ziemlich aufbrausende Diskussion.

Also gib mal bitte ein paar mehr Infos rüber damit wir weiter kommen.

EDIT : ... Code gefunden ... ein C-Programm ... muß ich erst mal durchsehen ...

Gruß
Dino
 
Hallo ,

mal sehen wie weit ich mit meinen dünnen C-Kenntnissen komme :rolleyes:
erste Analyse-Ergebnisse ...

1.
Du schaltest mit
Code:
DDRB = (1 << PB0 );
lediglich die Datenrichtung von PB0. Mehr nicht.
Also muß wohl deine LED nach +5V geschaltet sein weil nach einem Reset
das Register PORTB mit 0x00 gefüllt ist. Sonst würde die LED nicht leuchten.

2.
Was soll das Programm machen ?
Kommentare wären ne gute Idee ...
Irgendwas mit Timer0 ...
High an PB4 erhöht Variable A , Low vermindert Variable A.
Du fängst mit A=39 an und bewegst dich nachher zwischen 60 und 250.
Sieht so aus, als ob du an PB0/OC0A nen PWM-Signal für die LED erzeugen
willst was du mit nem Taster an PB4 hoch und runter dimmen kannst.
Versteh ich das so richtig ?

3.
für weitere Feinheiten müßte ich mir jetzt die Register von TimerCounter0
ansehen. Fehlt mir im Moment aber leider die Zeit für. Außerdem hab ich
mit den Timern noch nix gemacht. Dafür fehlt mir leider auch die Zeit :(
Zwischendurch mal kurz ist ok, aber jetzt längere Zeit analysieren geht
leider nicht.

Müßte mal jemand rübersehen der schon was mit Timern und C gemacht hat.

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)