Forum: Mikrocontroller und Digitale Elektronik TV-B-Gone(von adafruit) auf atmega32


von knuut (Gast)


Lesenswert?

Hey,

ich versuche gerade den TV-B-Gone nachzubauen. Allerdings funktioniert 
das bei mir nicht. Getestet habe ich bis jetzt zwei Fernseher von 
Herstellern, bei denen es laut Webseite funktionieren sollte.

Source-Code und Schaltplan
-> https://learn.adafruit.com/tv-b-gone-kit/download


Verwendeter uC: atmega32 16PU(16MHZ) (das "orginal" arbeitet mit 
ATTINY85V-10-PU, 8MHZ)

Schaltplan verändert:
Stromversorgung: 9V-Block-Batterie -> Spannungsregler(78S05)
Benutze nur eine IR-LED anstatt vier, die direkt am uC-Pin angeschlossen 
ist(anstatt über eine Transistor).

(OC0-PINB3)----Widerstand---IR-LED----VCC

Widerstand: 72 Ohm
IR-LED: 'oringal': Wellenlänge = 940nm
IR-LED: 'meine': SEP8705, Wellenlänge = 880nm(sollte laut 
Internet-Recherche nicht viel ausmachen), U: min:2,7V - max:7,8V; 
Imax=50mA
Wenn ich durch meine Kamera die IR-LED anschaue, sehe ich diese auch 
blinken.

Code verändert:
- EU-Code: hardcodiert (region = EU;)
- Die 'normale' LED weggelassen(sowohl im Code, als auch bei der 
Schaltung)
- delayfunktion geändert, da 16MHZ(anstatt 8MHZ wie im 
'orinalcode').("orginalcode" ist auskommeniert, und die delay-Funktion 
von gcc-avr benutzt). Leider habe ich kein Oszi um den Timer zu 
überprüfen.
1
void delay_ten_us(uint16_t us) 
2
{
3
  _delay_us(10.0 * us);
4
/*
5
  uint8_t timer;
6
  while (us != 0) {
7
    // for 8MHz we want to delay 80 cycles per 10 microseconds
8
    // this code is tweaked to give about that amount.
9
    for (timer = 0; timer <= DELAY_CNT; timer++) {
10
      NOP;
11
      NOP;
12
    }
13
    NOP;
14
    us--;
15
  }
16
*/
17
}


Ist bei den Änderungen die ich gemacht habe irgendwas falsch? Oder hatte 
ich einfach nur pech, dass es bei den Fernseher nicht funktioniert hat?

von holger (Gast)


Lesenswert?

void delay_ten_us(uint16_t us)
{
  _delay_us(10.0 * us);


_delay_us() funktioniert nicht mit Variablen.

von knuut (Gast)


Lesenswert?

Hey, danke. Das mann die delay_us() Funktion nicht mit Variablen 
aufrufen sollte wusste ich noch nicht. Ich habe den Programmcode jetzt 
folgendermaßen geändert:
1
void delay_ten_us(uint16_t us) {
2
        uint16_t i;
3
  uint16_t timer = 10.0 * us;
4
5
  for( i = 0; i < timer; ++i )
6
  {
7
      _delay_us(1);
8
  }
9
}

Allerdings ist das Blinken der LEDs jetzt wesentlich langsamer als 
zuvor. Da muss ich wohl mit die delay-Funktion nochmals überprüfen.

von knuut (Gast)


Lesenswert?

Hey, danke. Das mann die delay_us() Funktion nicht mit Variablen 
aufrufen sollte wusste ich noch nicht. Ich habe den Programmcode jetzt 
folgendermaßen geändert:
1
void delay_ten_us(uint16_t us) {
2
        uint16_t i;
3
4
  for( i = 0; i < us; ++i )
5
  {
6
      _delay_us(10);
7
  }
8
}

Allerdings ist das Blinken der LEDs jetzt wesentlich langsamer als 
zuvor. Da muss ich wohl mit die delay-Funktion nochmals überprüfen.

von Horst (Gast)


Lesenswert?

Wenn der delay routine die Controllerfrequenz bekannt ist, sollten 
solche Verrenkungen überflüssig sein.

#define F_CPU 16000000UL

von Horst (Gast)


Lesenswert?

Wenn man erst schreibt und dann nachdenkt kommt solch ein Dünnsinn bei 
raus.

Ich würde die original routine verwenden und mit den nop spielen.
Vermutlich müßten zwei zusätzliche, die höhere Frequenz kompensieren.

void delay_ten_us(uint16_t us)
{

  uint8_t timer;
  while (us != 0) {
    // for 8MHz we want to delay 80 cycles per 10 microseconds
    // this code is tweaked to give about that amount.
    for (timer = 0; timer <= DELAY_CNT; timer++) {
      NOP;
      NOP;
      NOP;
      NOP;
    }
    NOP;
    us--;
  }

}

von Horst (Gast)


Lesenswert?

Oder noch besser, wenn ich mir das Original ansehe:

#define DELAY_CNT 22


1
#define NOP __asm__ __volatile__ ("nop")
2
// This function delays the specified number of 10 microseconds
3
#define DELAY_CNT 11
4
void delay_ten_us(uint16_t us) {
5
  uint8_t timer;
6
  while (us != 0) {
7
    for (timer=0; timer <= DELAY_CNT; timer++) {
8
      NOP;
9
      NOP;
10
    }
11
    NOP;
12
    us--;
13
  }
14
}

von knuut (Gast)


Lesenswert?

Mit #define DELAY_CNT 22 habe ich es davor auch versucht, aber hat eben 
nicht wirklich geholfen.

Habe meine Fehler gefunden. Ich hatte die Taktfrequenz am AVR falsch 
gesetzt. Die war auf 1MHZ eingestellt anstatt auf 16MHz....

Funktionieren tut die ganze Schaltung leider immer noch nicht. 
Allerdings habe ich auch jetzt schon öfters gelesen, dass die ganzen 
Codes veraltet sind...

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.