Forum: Mikrocontroller und Digitale Elektronik Hilfe! ATtiny45-20PU "verfuset"


von Stefan K. (sdwarfs)


Lesenswert?

Hallo,

ich hab ausversehen einen meiner ATtiny45-20PU auf 16MHz -external- 
clock gefust (low_fuses=0xfe) und keinen Quarzoszillator da...
In http://www.mikrocontroller.net/articles/AVR_Fuses hab ich gelesen, 
man könnte einen anderen AVR als Taktgenerator nehmen. Aber das will 
nicht so recht funktionieren....

Ich habe folgenden Quellcode (arduino sketch) benutzt:
1
#define clk_out 0
2
3
void setup(){
4
  pinMode(clk_out, OUTPUT);     // set chargePin to output
5
  digitalWrite(clk_out, LOW);
6
}
7
8
void loop() {
9
  while (1) {
10
    digitalWrite(clk_out, HIGH);
11
    digitalWrite(clk_out, LOW);
12
  }
13
}

Laut Arduino "pins_arduino.h" ist die Übersetzung der Pin-Nummerierung 
wie folgt:
1
// ATMEL ATTINY45 / ARDUINO
2
//
3
//                  +-\/-+
4
// Ain0 (D 5) PB5  1|    |8  Vcc
5
// Ain3 (D 3) PB3  2|    |7  PB2 (D 2)  Ain1
6
// Ain2 (D 4) PB4  3|    |6  PB1 (D 1) pwm1
7
//            GND  4|    |5  PB0 (D 0) pwm0
8
//                  +----+

Diesen habe ich auf einen zweiten ATtiny45 geladen, der mit 8MHz 
(intern) läuft. Dieser ist mit auf dem Steckbrett, hängt am Strom und 
pin 5 (PB0 [D0]) ist mit XTAL1 (nach obigem Schema Pin 2 / PB3) des 
"verfusten" ATTiny angeklemmt. Dieser steckt in Steckbrett (Verkabelung 
unverändert) an gleicher Stelle an der ich eben noch den 
Taktgeber-ATtiny erfolgreich programmiert habe...

Der Effekt ist, dass avrdude als device signature unverändert 0xffffff 
liefert. Und natürlich den bootloader nicht flasht... auch nicht mit -F.

Um sicher zu sein, dass der Pin der Richtige ist, habe ich folgendes 
Programm auf den Taktgeber geladen und am Pin eine LED+Widerstand 
gehängt, welche wie erwartet im Sekundentakt an und aus schaltet:
1
int led = 0;
2
3
void setup() {                
4
  pinMode(led, OUTPUT);     
5
}
6
7
void loop() {
8
  digitalWrite(led, HIGH);
9
  delay(1000);
10
  digitalWrite(led, LOW);
11
  delay(1000);
12
}

Frage:
Was mache ich falsch?
Ist die Taktrate im obigen Programm vielleicht zu hoch?
Gibt es irgendwo nen sicher funktionierendes Taktgeber-Programm?

Danke ...

Stefan

von arduino (Gast)


Lesenswert?

keine Ahnung wie "schnell" die Funktionen übersetzt werden.

Probier mal das:
1
void loop() {
2
  while (1) {
3
    PORTB ^= 1;
4
  }
5
}

Das sollte schon deutlich schneller sein.

von Peter D. (peda)


Lesenswert?

digitalWrite() wird vermutlich eine sehr langsame Funktion sein. Sie muß 
ja die Arduino-Nummer wieder zurück in einen Portpin umrechnen und es 
gibt aber keine indirekte Bitadressierung.
Da werden vielleicht nur 50kHz rauskommen oder noch weniger.

Direktes Portpin setzen kostet dagegen nur 2 Zyklen und 1MHz sind 
erreichbar:
1
int main()
2
{
3
  for(;;){
4
    PORTB &= ~(1<<PB0);
5
    DDRB |= 1<<PB0;
6
    PORTB |= 1<<PB0;
7
  }
8
}


Peter

von Stefan K. (sdwarfs)


Lesenswert?

Hallo Leute,

danke für die Code-Schnipsel... ich hab mal beide Varianten kombiniert, 
um möglichst schnell zu werden:
1
#define clk_out 0
2
3
void setup(){
4
  pinMode(clk_out, OUTPUT);     // set chargePin to output
5
  digitalWrite(clk_out, LOW);
6
}
7
8
void loop() {
9
  while (1) {
10
    PORTB ^= 1<<PB0;
11
  }
12
}

UND: ES HAT FUNKTIONIERRRT! YEAH!

Danke! Jetzt funktioniert mein neues Spielzeug wieder! ;-)

Stefan

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.