www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bibliothek für ATmega32


Autor: Willy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

bin sehr neu hier im Forum und gerade dabei mein erstes AVR Projekt von
Beginn an zu machen.
Ich Verwende den ATmega 32 und Codvision.

Meine Frage ist, ob es eine Bibliothek für ATmega 32 und Codvision
gibt, mit der ich einen Pin direkt ansprechen kann? (z.B. (1<<PINA1)

Die <avr/io.h> Funktioniert für Codvision leider nicht.

Weiterhin möchte ich meinen AD Wandler konfigurieren.
möchte über die Pins ADC3 und ADC4 abwechslend Signale einlesen.

das ADMUX Register habe ich erstmal auf auf 0x00 gesetzt und das ADCSRA
auf 0x87.

Nun ist mein Problem, wie ich am besten immer nacheinander die beiden
Pins auslese und die Werte aus den ADCL und ADCH Registern auslese.

Möchte das ganze in C umsetzen.

Hoffe auf ein paar hilfreiche Antworten.

Danke vorab.

Autor: Tobias A. (inselaffe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

also Du stellst erstmal im Codegenerator den ATmega32 ein.
Dann kannst du noch bisschen weiter konfigurieren.
Codevision ist was für Faule und Bequeme (der Grund warum ich es auch
nutze)

Wenn Du nen Pin als eingang checken willst geht das mit

PINA.1
z.B. das ist Port A pin 1 als input betrachtet (Musst allerdings DDRA
vorher auf 0X00 setzen - alternativ im Codegenerator als input
setzen).

Den AD schaltest Du auch einfach im codegenerator an und dann gibts so
was wie
adcread oder so.. schau in die hilfe da stehts mit beispiel drin, hab
nur grad kein Codevision auf dem Laptop.
Falls es weiter klemmt einfach mal nochmal schreiben.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit CodeVision hast du die schöne Möglichkeit, einzelne Bits einfach
anzusprechen. Nicht ganz C-conform, aber nützlich :-)

bit test;
test=PINB.1;

oder auch:
while (!PINC.7);

Und hier noch ein Beispiel für den A/D-Wandler, wizzard lässt grüssen.


#include <mega32.h>

#define FIRST_ADC_INPUT 3
#define LAST_ADC_INPUT 4
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0x40

// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
register static unsigned char input_index=0;
// Read the AD conversion result
adc_data[input_index]=ADCW;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
   input_index=0;
ADMUX=(FIRST_ADC_INPUT|ADC_VREF_TYPE)+input_index;
// Start the AD conversion
ADCSRA|=0x40;
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T
State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T
State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T
State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T
State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=FIRST_ADC_INPUT|ADC_VREF_TYPE;
ADCSRA=0xCF;

// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here

      };
}

Autor: Tobias A. (inselaffe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich seh schon, crazy horse hat codevision auf dem PC drauf :-)
noch einer mit dem man sich mal austauschen kann :-)

Autor: Willy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke schon mal für die schnellen Antworten,

ich werde heut das ganze mal probieren, bei erneuten problemen gibt es
ja das schöne forum hier. ist wirklich hilfreich so etwas nutzen zu
können.

Autor: Vexti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo .. ja Codevision hat sich da schon was feines einfallen lassen.
Mich stört nur, dass sämmtliche Initialisierungen (Ports, Usart, Adc
usw.) in der main.c(so nenn ich den Hauptquelltext) untergebracht
werden, wobei da die Übersicht verloren geht.
Desweiteren hinkt Cavr jedesmal mit updates hinterher, wenn Atmel mal
wieder für sein STK500 etwas neues gemacht hat(AVR Studio) .. man kann
dann im Cavr nicht mehr das STK ansprechen.
... aber sonst ist das Proggi einfach gut zu bedienen und auch die
librarys darin kann man gut gebrauchen :-)

Autor: Willy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt schon ne ganze weile im Codvision an dem AD-Code
rumgebastelt.
Mein Problem ist, das Codvison solche Ausdrücke wie
"ADCSRA|=(1<<ADSC)"
nicht kennt, wie kann man so etwas umgehen oder sogra ermöglichen?
Habe mich entschieden erstmal einfach anzufangen und einen AD-Kanal am
Pin 3 zu nutzen.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schreibs in die mega32.h rein.
#define ADSC 7

Autor: Vexti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir mal das ASC8535.C in Examples an da steht:

// ADC initialization
// ADC Clock frequency: 57.656 kHz
// ADC Interrupts: On
ADCSR=0x8E;

// Global enable interrupts
#asm("sei")

// Select ADC input 0
ADMUX=0;

// Start the first AD conversion
ADCSR|=0x40;

im übrigen kann es sein, daß das ADCSRA (also dann ADCSR) nicht kennt

mfg ..

Autor: Tobias A. (inselaffe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"ADCSRA|=(1<<ADSC)"

Du brauchst net mit assembler rumfummeln. Das geht alles schön in C
es gibt ne menge guter AD routinen - die Hilfe ist dein Freund

wenn inline assembler sein muss dann
#ams("   ");

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.