Forum: Mikrocontroller und Digitale Elektronik Blinklicht ATtiny 45


von Vinzenz M. (sorrow)


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
}

von Johannes M. (johnny-m)


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...

von Vinzenz M. (sorrow)


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.

von Johannes M. (johnny-m)


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).

von Tim (Gast)


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...

von Jörg X. (Gast)


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

von Vinzenz M. (sorrow)


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!

von Johannes M. (johnny-m)


Lesenswert?

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

von Johannes M. (johnny-m)


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?

von Stefan B. (stefan) Benutzerseite


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.

von Vinzenz M. (sorrow)


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.

von Stefan B. (stefan) Benutzerseite


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.

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.