C Code AD-Wandler

Gast #4888160
Hallo,

ich habe ein evaluation board gekauft und der Hersteller lieferte dazu 
paar Beispiel Codes um mit dem Board bisschen spielen zu können.
Die Hardwarenahe C-Programmierung ist zwar neuland für mich aber ich bin 
trotzdem der Meinung, dass es so nicht funktionieren kann (Es 
funktioniert auch nicht).
Laut Hersteller Soll der Speaker an PC.0 angeschlossen werden. Ich sehe 
aber nirgendswo im Code, dass der C Port konfiguriert wurde! Oder, dass 
er die Anweisung bekommt, ein Signal auszugeben!

Ich wäre euch dankbar, wenn ihr mir da weiterhelft.

LG,

Georg
1
//--------------------------------------------------------------------------
2
// Titel         : Beispiel "Analog-Digital-Wandler" für dem ATmega8
3
//--------------------------------------------------------------------------
4
// Funktion      : Wandelt ein analoges Signal in ein digitales
5
// Schaltung     : Poti an PC.0, SPeaker an PB.0, AVCC, AGND, AVREF
6
//--------------------------------------------------------------------------
7

8
unsigned char timer_value;
9
ISR (TIMER0_OVF_vect)
10
{
11
  PORTB = ~ PORTB;    // Flankenwechsel für Tonfrequenz
12
  TCNT0 = timer_value;
13
}
14

15
ISR(ADC_vect)
16
{
17
  int adc_value;
18
  adc_value=ADC;
19
  timer_value=char(adc_value/4);
20
  sbi  (ADCSRA,6);      // restart ADC
21
}
22

23
void adcInit()
24
{
25
  ADMUX=0;
26
  ADCSRA=0xDD;      //0b11011101, ADC-Clock, ADC ON, INT ON
27
}
28

29
void timer0Init()
30
{
31
  timer_value=0xFF;
32
  TCCR0=0x03;        // 0b00000011, Vorteiler 64
33
  TIMSK=0x01;        // 0b00000001, maskiere Timer-INT
34
}
35

36
void portsInit()
37
{
38
  sbi(DDRB,0);      //OUT Summer
39
  sbi(DDRB,1);      //OUT LED
40
}
41

42
//----------------------------------------------------------------------
43
main ()                // Hauptprogramm, startet bei Power ON und Reset
44
{
45
  //Initialisierung
46
  portsInit();      // PortB als Ausgang initialisieren
47
  timer0Init();      // Timer Interrupt initialisieren
48
  adcInit();
49
  sei();                          // enable interrupts
50
  do { } while(true);    // mainloop
51
}
52
//----------------------------------------------------------------------
(Firma: matzetronics) #4888208
Georg schrieb:
> unsigned char timer_value;

Schreib da mal bitte ein 'volatile' davor. Der Grund ist, das der 
Compiler zwar sieht, das du im Hauptprogramm diese Variable vorbesetzt, 
für ihn sind ISR Routinen aber Programmteile, die nie angesprungen 
werden.
'volatile' weist den Compiler an, trotzdem diese Variable nicht 
wegzuoptimieren.
Moderator #4888222
Matthias S. schrieb:
> Schreib da mal bitte ein 'volatile' davor.

Das ist in dem Beispiel nicht nötig.

> Der Grund ist, das der Compiler zwar sieht, das du im Hauptprogramm
> diese Variable vorbesetzt, für ihn sind ISR Routinen aber
> Programmteile, die nie angesprungen werden.

Das würde er nur denken, wenn die Interruptroutine als static deklariert
wäre. Dann würde er die komplette Routine wegoptimieren.

Georg schrieb:
> Ich sehe aber trotzdem keine Zeile wo der PORT C defeniert wird.

Da muss auch nichts Spezielles für den PORT C definiert werden. Es muss
lediglich der Kanal über ADMUX eingestellt und der ADC über ADCSRA
aktiviert werden. Beides wird im Programm auch getan.
#4888747
Georg schrieb:
> klar... sorry mein Fehler... Ich meinte natürlich PB.0
> Ich sehe aber trotzdem keine Zeile wo der PORT C defeniert wird.

Wenn der ADC auf PC0 eingestellt ist, wird PC0 als analoger Eingang 
verwendet, daher kann man den Pin nicht für digitale Ein-/Ausgaben 
verwenden.

Lies dazu mehr im Datenblatt des verwendeten Mikrocontrollers im 
Abschnitt zum ADC.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.