Forum: Mikrocontroller und Digitale Elektronik Bibliothek für ATmega32


von Willy (Gast)


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.

von Tobias A. (inselaffe)


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.

von crazy horse (Gast)


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

      };
}

von Tobias A. (inselaffe)


Lesenswert?

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

von Willy (Gast)


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.

von Vexti (Gast)


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 :-)

von Willy (Gast)


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.

von crazy horse (Gast)


Lesenswert?

schreibs in die mega32.h rein.
#define ADSC 7

von Vexti (Gast)


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 ..

von Tobias A. (inselaffe)


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("   ");

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.