Forum: Mikrocontroller und Digitale Elektronik C Code AD-Wandler


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Georg (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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
//----------------------------------------------------------------------

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Georg schrieb:
> Laut Hersteller Soll der Speaker an PC.0 angeschlossen werden

laut Quellcode aber an

> sbi(DDRB,0);      //OUT Summer


B0

von Waldemar Z. (waldemar_z)


Bewertung
0 lesenswert
nicht lesenswert
Das steht:
---
Poti an PC.0, SPeaker an PB.0
---

der adc ist scheinbar auf pc0 eingerichtet. Speaker soll an pb0

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Georg (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Waldemar Z. schrieb:
> der adc ist scheinbar auf pc0 eingerichtet. Speaker soll an pb0

klar... sorry mein Fehler... Ich meinte natürlich PB.0
Ich sehe aber trotzdem keine Zeile wo der PORT C defeniert wird.

von Peter II (Gast)


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

Input ist doch der Standard, da muss nichts definert werden.

von Yalu X. (yalu) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Waldemar Z. (waldemar_z)


Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.