www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Blinklicht ATtiny 45


Autor: Vinzenz Messerli (sorrow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich habe ein Problem mit meinem ATtiny 45.
Ich will am PIN 3 (PB4) ein getaktetes Signal(ca 1 Hz)ausgeben und an 
einer LED anzeigen. Nun messe ich aber an diesem PIN eine Spannung von 
+5V getaktet mit 8kHz. Ich hab den MCU aus der Schaltung genommen und 
auf ein Protoboard gesteckt und nur die Speisung angehängt.
Kann mir wer helfen???

Danke schon mal für eure Tipps!
//Demoprogramm//
#include <avr/io.h>

#define bitset(Register,Bit) Register |= (1<<Bit)    // Bit auf HIGH setzen
#define bitclr(Register,Bit) Register &= (~(1<<Bit))    // Bit auf LOW setzen
#define bittst(Register,Bit) ((Register & (1<<Bit))>>Bit)


int i=0;

//Delay Programm
void delay_ms(uint16_t ms)
{        
  uint16_t cntms, cntd;          //1..65000ms möglich
  for(cntms=0;cntms<ms;cntms++)
  {
    for(cntd=0;cntd<58000;cntd++);
  }
}

void SysInit() 
{
  DDRB = 0x14;
}

void blink()  
{
  if(i<50)
        {
    bitset(PORTB,4);
  }
  else    
        {
    bitclr(PORTB,4);
  }
}

void cnt()    
{
  if(i<100)  
        {
    i++;
  }
  else    
        {
    i=0;
  }
}



int main (void) 
{
  SysInit();
  while(1) 
  {
  blink();
  cnt();
  delay_ms(20);
  }
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vinzenz Messerli wrote:
> Kann mir wer helfen???
Möglicherweise ist hier grad ein Hellseher online, der Deinen 
Programmcode und Deine Hardware sehen kann. Meine hellseherischen 
Fähigkeiten sind leider heute etwas beschränkt...

Autor: Vinzenz Messerli (sorrow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, hab den ersten Beitrag hier im Forum gemacht und hat mit dem code 
anhängen hats noch nicht geklappt. jetzt ist er aber auch dabei.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leere Zählschleifen sind gefundenes Fressen für den Optimizer! Das kann 
so nichts werden. Wenn Du schon mit Verzögerungsschleifen arbeiten 
willst, dann benutze bitte die _delay_XX-Funktionen aus der 
util/delay.h. Allerdings solltest Du Dich dringendst mit der 
Verwendung der Timer befassen. Solche Busy-Wait-Funktionen sind 
ausschließlich dafür vorgesehen, kurze Verzögerungen im Programm zu 
erzeugen, und nicht für lange Wartereien. Außerdem muss bei der 
Verwendung von _delay_ms bzw. _delay_us beachtet werden,  dass die nur 
bei eingeschaltetem Optimizer, mit konstanten, zur Compiler-Laufzeit 
bekannten Werten und bis zu einer Taktfrequenz-abhängigen Maximalzeit 
funktionieren (AVR-libc-Doku beachten).

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann Johannes nur zustimmen.

Du solltest dich wirklich mit Timern und Interupts beschäftigen.

Trotzdem ein tipp (Aber nur zum testen!):
Ändere die leere Schleife mal in:
    for(cntd=0; cntd < 58000; cntd++){
        asm volatile ("nop");
    };
ggf must du dann die 58000 etwas anpassen...

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Tim:
>    for(cntd=0; cntd < 58000; cntd++){
>        asm volatile ("nop");
>    };
..Dann mach es gleich richtig!
//beim AVR-GCC
#include <util/delay.h>
void delay_ms(uint16_t ms)
{
  for(; ms ;--)
  {
    // geht nur bis 262.14/Takt[MHz]:
    _delay_ms(1);
  }
}

hth. Jörg

Autor: Vinzenz Messerli (sorrow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist mein erstes projekt mit einem mcu dessen umgebung ich selbst mache.
bin also ein absoluter anfänger.
könnnte mir vielleicht noch einer erklären wieso ich am pin PB4 
konstante +5V habe die mit 8 MHZ getaktet ist?
hab da absolut keinen plan!
werde versuchen eure vorschläge umzusetzen, danke!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg X. wrote:
> ..Dann mach es gleich richtig!
> for(; ms ;--)
Na, ob das wohl so richtig ist? Wohl eher
for(;;ms--)
{
    //Code
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vinzenz Messerli wrote:
> könnnte mir vielleicht noch einer erklären wieso ich am pin PB4
> konstante +5V habe die mit 8 MHZ getaktet ist?
Oh, jetzt sind es plötzlich 8 MHz. Am Anfang waren's noch 8 kHz... Wat 
denn nu?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das gibt es mehrere Möglichkeiten.

1/ C-Programm arbeitet und die Frequenzmessung ist falsch. Um PB4 mit 9 
MHz in C zu schalten müsste der Takt heftig hoch sein und dein _delay_ms 
absolut unwirksam.... Welche Taktquelle benutzt du?

2/ Auf PB4 wird CLK0 ausgegeben, d.h. im µC wurde die Fuse CKOUT 
programmiert, die vom Werk aus unprogrammiert ist. Mehr dazu im Artikel 
AVR Fuses und im ausführlichen Datenblatt auf Seite 61.

Autor: Vinzenz Messerli (sorrow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als Taktquelle benutze ich den internen Oszillator des MCU.
Ich messe mit dem Oszilloskop eine Frequenz von 8 MHZ an PB4.
Wie schon erwähnt habe ich den MCU auf ein Steckboard gestekckt und nur 
die Speisung angelegt messe aber trotzdem, mit dem oben geposteten 
Programm die 8 MHZ an PB4.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm. Wäre wie gesagt erklärbar, wenn CKOUT programmiert ist UND CKDIV8 
gelöscht ist (unprogrammiert). Dann wird der interne Takt (8MHz) 
ungeteilt an CLK0 (=PB4) ausgegeben. Mach wenn es geht mal eine 
Übersicht, welche Fuses wie gesetzt sind (Screenshot wie im Artikel 
AVR Fuses). Dein Programm kann dann mit PB4 anstellen, was es will, 
es wird nicht beachtet.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.