Avatar billede alphadk82 Nybegynder
10. juni 2004 - 10:05 Der er 7 kommentarer

Microcontroller programmerings problem

Hejsa, jeg har fået stillet en opgave, nemlig at jeg skal programmere en Atmel 90S8535 microcontroller til at måle temperaturen ved hjælp af en nogle eksterne sensorer som sidder på port A, det skal så igennem ADC'en så processoren forstår det. Problemet er at jeg ikke kan få det til at virke, og vi har fundet ud af at det er programmet der er problemet. Så er der nogle stykker der kender til sådan noget her, der kan hjælpe mig? Her følger hele koden til til programmet:


/*********************************************
This program was produced by the
CodeWizardAVR V1.24.0 Evaluation
Automatic Program Generator
© Copyright 1998-2003 HP InfoTech s.r.l.
http://www.hpinfotech.ro
e-mail:office@hpinfotech.ro

Project :
Version :
Date    : 02-06-2004
Author  : Freeware, for non-commercial use only
Company :
Comments:


Chip type          : AT90S8535
Clock frequency    : 8,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size    : 128
*********************************************/

#include <90s8535.h>
#include <LCD-display.h>
#include <stdio.h>

// Alphanumeric LCD Module functions
#asm
  .equ __lcd_port=0x15
#endasm
#include <lcd.h>


// Declare your global variables here

void front()
{
          lcd_clear();                //Slet display (kan udelades her).
    lcd_gotoxy(1,0);              //Start 1.linie, 2.tegn (kan udelades her).
    lcd_putsf("Temperaturstyring");        //Skriv tekst til display.
    lcd_gotoxy(3,1);                  //Start 2.linie, 4.tegn.
    lcd_putsf("v. 0,2 beta");        //Skriv tekst til display.
    lcd_gotoxy(3,3);                  //Start 3.linie, 4.tegn.
    lcd_putsf("Vælg funktion");        //Skriv tekst til display.
}

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input;
// Start the AD conversion
ADCSR|=0x40;
// Wait for the AD conversion to complete
while ((ADCSR & 0x10)==0);
ADCSR|=0x10;
return ADCW;
}


void main(void)
{
// Declare your local variables here
unsigned char lcd_buffer1[30];

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

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

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

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

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=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
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=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
GIMSK=0x00;
MCUCR=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
// Analog Comparator Output: Off
ACSR=0x80;

// LCD module initialization
lcd_init(20);

// ADC initialization
// ADC Clock frequency: 125,000 kHz
ADCSR=0x86;
   
front();

while (1)
    {
    if(PINA.4)
       
        {       
        read_adc(0);
        lcd_clear();
        lcd_gotoxy(6,0);
        lcd_putsf("Status");
        lcd_gotoxy(4,2);
            sprintf(lcd_buffer1,"%u",ADCW);
            lcd_puts(lcd_buffer1); 

        }
       
    if(PINA.5)
       
        {
       
        lcd_clear();
        lcd_gotoxy(4,0);
        lcd_putsf("Alarmgrænse");
       
        }
       
   
    if(PINA.6)
   
        {
       
        lcd_clear();
        lcd_gotoxy(4,0);
        lcd_putsf("Svinginger");
       
        }
   
   
    if(PINA.7)
               
        {
       
        front();
       
       
        }

      };
}
Avatar billede bertelbrander Novice
10. juni 2004 - 20:09 #1
Jeg kender ikke Atmel, men det kunne måske hjælpe hvis du fortalte hvad det er der ikke virker, f.ex. sker der noget på displayet?
Avatar billede alphadk82 Nybegynder
11. juni 2004 - 09:12 #2
Alt teksten kommer fint nok frem på displayet, men der hvor temperaturen skal stå står der bare nogle underlige tal (Når jeg har sat temperaturføleren til skriver den forskellige tal mellem 95-98, og når den ikke sidder til skriver den ca. 13)
Avatar billede segmose Nybegynder
11. juni 2004 - 09:52 #3
I
sprintf(lcd_buffer1,"%u",ADCW);
skulle ADCW muligvis udskiftes med read_adc(0) hvis ADCW er en macro der læser fra en port, da den ellers ville blive læst 2 gange isåfald, read_adc lige over skulle så væk.
Avatar billede alphadk82 Nybegynder
11. juni 2004 - 11:07 #4
segmose - Det hjalp ikke.

Vi har ændret i koden nu, for at kunne teste det lidt bedre, smider lige koden, så kan i jo kigge lidt på det:


/*********************************************
This program was produced by the
CodeWizardAVR V1.24.0 Evaluation
Automatic Program Generator
© Copyright 1998-2003 HP InfoTech s.r.l.
http://www.hpinfotech.ro
e-mail:office@hpinfotech.ro

Project :
Version :
Date    : 02-06-2004
Author  : Freeware, for non-commercial use only
Company :
Comments:


Chip type          : AT90S8535
Clock frequency    : 8,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size    : 128
*********************************************/

#include <90s8535.h>
#include <LCD-display.h>
#include <stdio.h>
#include <delay.h>

// Alphanumeric LCD Module functions
#asm
  .equ __lcd_port=0x15
#endasm
#include <lcd.h>


// Declare your global variables here
unsigned char lcd_buffer1[30];
char test;
void front()
{
          lcd_clear();                //Slet display (kan udelades her).
    lcd_gotoxy(1,0);              //Start 1.linie, 2.tegn (kan udelades her).
    lcd_putsf("Temperaturstyring");        //Skriv tekst til display.
    lcd_gotoxy(3,1);                  //Start 2.linie, 4.tegn.
    lcd_putsf("v. 0,2 beta");        //Skriv tekst til display.
    lcd_gotoxy(3,3);                  //Start 3.linie, 4.tegn.
    lcd_putsf("Vælg funktion");        //Skriv tekst til display.
}

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input;
// Start the AD conversion
ADCSR|=0xC0;
// Wait for the AD conversion to complete
while ((ADCSR & 0x10)==0);
{
}

ADCSR|=0x10;
test=ADCL;

lcd_gotoxy(4,2);
sprintf(lcd_buffer1,"%u",test);
lcd_puts(lcd_buffer1); 
delay_ms(2000);

return ADCW;
}


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


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

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

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

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

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=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
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=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
GIMSK=0x00;
MCUCR=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
// Analog Comparator Output: Off
ACSR=0x80;

// LCD module initialization
lcd_init(20);

// ADC initialization
// ADC Clock frequency: 125,000 kHz
ADCSR=0x86;
   
front();

while (1)
    {
    if(PINA.4)
       
        {       
        read_adc(0b00000000);
        lcd_clear();
        lcd_gotoxy(6,0);
        lcd_putsf("Status");
        lcd_gotoxy(4,2);
            sprintf(lcd_buffer1,"%u",test);
            lcd_puts(lcd_buffer1); 

        }
       
    if(PINA.5)
       
        {
       
        lcd_clear();
        lcd_gotoxy(4,0);
        lcd_putsf("Alarmgrænse");
       
        }
       
   
    if(PINA.6)
   
        {
       
        lcd_clear();
        lcd_gotoxy(4,0);
        lcd_putsf("Svinginger");
       
        }
   
   
    if(PINA.7)
               
        {
       
        front();
       
       
        }

      };
}
Avatar billede alphadk82 Nybegynder
11. juni 2004 - 14:32 #5
Nå, tror vist at vi har fundet ud af det, men tak alligevel for svarene :)
Avatar billede segmose Nybegynder
14. juni 2004 - 10:52 #6
Fortæller du hvad der var galt?
(læg et svar og tag point selv).
Avatar billede alphadk82 Nybegynder
14. juni 2004 - 13:32 #7
Det gør jeg da lige så da :D

Vi har dog nogle små problemer med den stadig, men vi tror at det er elektronikken der er problemet der.


/*********************************************
This program was produced by the
CodeWizardAVR V1.24.0 Evaluation
Automatic Program Generator
© Copyright 1998-2003 HP InfoTech s.r.l.
http://www.hpinfotech.ro
e-mail:office@hpinfotech.ro

Project :
Version :
Date    : 02-06-2004
Author  : Freeware, for non-commercial use only
Company :
Comments:


Chip type          : AT90S8535
Clock frequency    : 8,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size    : 128
*********************************************/

#include <90s8535.h>
#include <LCD-display.h>
#include <stdio.h>
#include <delay.h>

// Alphanumeric LCD Module functions
#asm
  .equ __lcd_port=0x15
#endasm
#include <lcd.h>


// Declare your global variables here
unsigned char lcd_buffer1[30];
char test;
char test2;
void front()
{
          lcd_clear();                //Slet display (kan udelades her).
    lcd_gotoxy(1,0);              //Start 1.linie, 2.tegn (kan udelades her).
    lcd_putsf("Temperaturstyring");        //Skriv tekst til display.
    lcd_gotoxy(3,1);                  //Start 2.linie, 4.tegn.
    lcd_putsf("v. 0,2 beta");        //Skriv tekst til display.
    lcd_gotoxy(3,3);                  //Start 3.linie, 4.tegn.
    lcd_putsf("Vælg funktion");        //Skriv tekst til display.
}

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input;
// Start the AD conversion
ADCSR|=0xE0;
// Wait for the AD conversion to complete
while ((ADCSR & 0x10)==0);
{
}

ADCSR|=0x10;
test=ADCL;
test2=ADCH;

test = test / 4;
test2 = test2 * 64;

test = test + test2;

lcd_gotoxy(4,2);
sprintf(lcd_buffer1,"%u",test);
lcd_puts(lcd_buffer1); 
delay_ms(2000);

return ADCW;
}


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


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

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

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

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

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=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
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=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
GIMSK=0x00;
MCUCR=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
// Analog Comparator Output: Off
ACSR=0x80;

// LCD module initialization
lcd_init(20);

// ADC initialization
// ADC Clock frequency: 125,000 kHz
ADCSR=0x86;
   
front();

while (1)
    {
    if(PINA.4)
       
        {
       
        start:               
        read_adc(0b00000001);
        lcd_clear();
        lcd_gotoxy(6,0);
        lcd_putsf("Status");
        lcd_gotoxy(4,2);
        sprintf(lcd_buffer1,"%u",test);
          lcd_puts(lcd_buffer1); 
                goto start;
                                                       
        }
       
    if(PINA.5)
        k
        {
       
        lcd_clear();
        lcd_gotoxy(4,0);
        lcd_putsf("Alarmgrænse");
       
        }
       
   
    if(PINA.6)
   
        {
       
        lcd_clear();
        lcd_gotoxy(4,0);
        lcd_putsf("Svinginger");
       
        }
   
   
    if(PINA.7)
               
        {
       
        front();
       
       
        }

      };
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester