работаю с mega16.
нужно поргнать через АЦП последовательность, которая читается из внешнего файла.
Для этого я цепляю немного измененный SetupAdvanced.mac из туториала. Изменения соответственно сделаны по адресу входного файла и по адресу прерывания.
После make ошибок и предупреждений нету.
Код:
Код
// enable use of extended keywords
#pragma language=extended
#include <iom16.h>
#include <stdio.h>
#include <inavr.h>
#include <main.h> // пользовательский хедер
#ifndef ENABLE_BIT_DEFINITIONS
#define ENABLE_BIT_DEFINITIONS
// Enable the bit definitions in the iom16.h file
#endif
void InitADC(void)
{//REFS1,REFS0,ADLAR,MUX4,MUX3,MUX2,MUX1,MUX0 reverse
MUX = ((1<<0)|(0<<1)|(0<<2)|(0<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7));
//ADEN,ADSC,ADATE,ADIF,ADIE,ADPS2,ADPS1,ADPS0 reverse
ADSR1= ((1<<0)|(0<<1)|(1<<2)|(1<<3)|(0<<4)|(0<<5)|(1<<6)|(1<<7));
}
void InitPort(void)
{
DDRA=0x00;
DDRB=0xff;
}
void do_foreground_process( void )
{
putchar('.');
}
// The showstopper
int callCount = 0;
// IRQ handler
#pragma vector=ADC_vect
__interrupt void irqHandler(void)
{
int a_1 = ADC;
ADC=0;
int out=a_1;
unsigned int dec = 10, temp;
putchar ( '\n' );//перенос строки
//выделение десятков и единиц
while ( dec <= out ) //10^x dec ближайшее значение
dec *= 10;
while ( (dec/=10) >= 10 )
{
temp = out/dec;
putchar ( '0' + temp );
out -= temp*dec;
}
putchar ( '0' + out );
// increment the show stopper
++callCount;
}
main( void )
{
InitADC();
InitPort();
__enable_interrupt();
/* now loop 'forever', taking input when interrupted */
while (1)
{
do_foreground_process();
}
}
#pragma language=extended
#include <iom16.h>
#include <stdio.h>
#include <inavr.h>
#include <main.h> // пользовательский хедер
#ifndef ENABLE_BIT_DEFINITIONS
#define ENABLE_BIT_DEFINITIONS
// Enable the bit definitions in the iom16.h file
#endif
void InitADC(void)
{//REFS1,REFS0,ADLAR,MUX4,MUX3,MUX2,MUX1,MUX0 reverse
MUX = ((1<<0)|(0<<1)|(0<<2)|(0<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7));
//ADEN,ADSC,ADATE,ADIF,ADIE,ADPS2,ADPS1,ADPS0 reverse
ADSR1= ((1<<0)|(0<<1)|(1<<2)|(1<<3)|(0<<4)|(0<<5)|(1<<6)|(1<<7));
}
void InitPort(void)
{
DDRA=0x00;
DDRB=0xff;
}
void do_foreground_process( void )
{
putchar('.');
}
// The showstopper
int callCount = 0;
// IRQ handler
#pragma vector=ADC_vect
__interrupt void irqHandler(void)
{
int a_1 = ADC;
ADC=0;
int out=a_1;
unsigned int dec = 10, temp;
putchar ( '\n' );//перенос строки
//выделение десятков и единиц
while ( dec <= out ) //10^x dec ближайшее значение
dec *= 10;
while ( (dec/=10) >= 10 )
{
temp = out/dec;
putchar ( '0' + temp );
out -= temp*dec;
}
putchar ( '0' + out );
// increment the show stopper
++callCount;
}
main( void )
{
InitADC();
InitPort();
__enable_interrupt();
/* now loop 'forever', taking input when interrupted */
while (1)
{
do_foreground_process();
}
}
проблема в следующем: функция Accsess() почему-то вызывается дважды при попадании на это прерывание, а нужно чтобы было один раз, поскольку значения в ADC складываются.
Код
Fri Dec 15 00:13:43 2006: Loaded macro file: E:\Учеба\MC\new\SetupAdvanced.mac
Fri Dec 15 00:13:43 2006: Loaded debugee: E:\Учеба\MC\new\Debug\Exe\new.d90
Fri Dec 15 00:13:43 2006: Target reset
Fri Dec 15 00:13:43 2006: execUserReset() called
Fri Dec 15 00:13:43 2006: execUserSetup() called
Fri Dec 15 00:13:45 2006: Access() called
Fri Dec 15 00:13:45 2006: ADC = 0x00000001
Fri Dec 15 00:13:45 2006: Access() called
Fri Dec 15 00:13:45 2006: ADC = 0x00000001
Fri Dec 15 00:13:45 2006: Breakpoint hit: Code @ main.c:39.7
Fri Dec 15 00:13:43 2006: Loaded debugee: E:\Учеба\MC\new\Debug\Exe\new.d90
Fri Dec 15 00:13:43 2006: Target reset
Fri Dec 15 00:13:43 2006: execUserReset() called
Fri Dec 15 00:13:43 2006: execUserSetup() called
Fri Dec 15 00:13:45 2006: Access() called
Fri Dec 15 00:13:45 2006: ADC = 0x00000001
Fri Dec 15 00:13:45 2006: Access() called
Fri Dec 15 00:13:45 2006: ADC = 0x00000001
Fri Dec 15 00:13:45 2006: Breakpoint hit: Code @ main.c:39.7
Что посоветуете, может это можно как-нибудь по-другому сделать?
И если можно по-быстрее курсач на следующей неделе сдавать, а в AVR Studio писать не охота, да и очень хочется на С научиться нормально писать.
Заранее всем спасибо!

p.s. Извиняюсь, что ошибся разделом...
