Bibliothek für ATmega32

Gast #361388
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.
#361389
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.
Gast #361390
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

      };
}
Gast #361392
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.
Gast #361393
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 :-)
Gast #361394
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.
Gast #361396
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 ..

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren