Blinklicht ATtiny 45

OP #712351
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!
1
//Demoprogramm//
2
#include <avr/io.h>
3

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

8

9
int i=0;
10

11
//Delay Programm
12
void delay_ms(uint16_t ms)
13
{        
14
  uint16_t cntms, cntd;          //1..65000ms möglich
15
  for(cntms=0;cntms<ms;cntms++)
16
  {
17
    for(cntd=0;cntd<58000;cntd++);
18
  }
19
}
20

21
void SysInit() 
22
{
23
  DDRB = 0x14;
24
}
25

26
void blink()  
27
{
28
  if(i<50)
29
        {
30
    bitset(PORTB,4);
31
  }
32
  else    
33
        {
34
    bitclr(PORTB,4);
35
  }
36
}
37

38
void cnt()    
39
{
40
  if(i<100)  
41
        {
42
    i++;
43
  }
44
  else    
45
        {
46
    i=0;
47
  }
48
}
49

50

51

52
int main (void) 
53
{
54
  SysInit();
55
  while(1) 
56
  {
57
  blink();
58
  cnt();
59
  delay_ms(20);
60
  }
61
}
#712363
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).
Gast #712374
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:
1
    for(cntd=0; cntd < 58000; cntd++){
2
        asm volatile ("nop");
3
    };
ggf must du dann die 58000 etwas anpassen...
Gast #712501
Lesenswert?

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

hth. Jörg
OP #712514
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!
Persönliche Seite #712530
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.
OP #712538
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.
Persönliche Seite #712579
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

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