 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
cupacup Član

Pridružen-a: Tor 20 Jul 2004 21:28 Prispevkov: 68 Aktiv.: 0.29 Kraj: Tam kjer ma mraz mlade
|
Objavljeno: Ned Jun 18, 2006 10:04 pm Naslov sporočila: CVAVR pomoč |
|
|
Imam problem iz porta PC0 berem analogno vrednost vendar mi uc vedno vrže 1023 in ne nižjih vrednosti čepravi bi moral, kaj delam narobe?
Koda: |
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.6 Standard
Automatic Program Generator
© Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com
Chip type : ATmega8
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
#include <delay.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// USART Transmitter buffer
#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];
#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif
// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif
// Standard Input/Output functions
#include <stdio.h>
unsigned int adc_data;
#define ADC_VREF_TYPE 0x00
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
// Read the AD conversion result
adc_data=ADCW;
}
// Read the AD conversion result
// with noise canceling
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
#asm
in r30,mcucr
cbr r30,__sm_mask
sbr r30,__se_bit | __sm_adc_noise_red
out mcucr,r30
sleep
cbr r30,__se_bit
out mcucr,r30
#endasm
return adc_data;
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// 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
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// 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
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
// 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
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 38400
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;
// 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: AREF pin
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x8E;
// Global enable interrupts
#asm("sei")
while (1)
{
delay_ms(1000);
printf("adc0 kaže %4u\n",read_adc(0));
printf("adc1 kaže %4u\n",read_adc(1));
};
}
|
|
|
Nazaj na vrh |
|
 |
VolkD Član


 
Pridružen-a: Pet 24 Sep 2004 21:58 Prispevkov: 14228 Aktiv.: 60.07 Kraj: Divača (Kačiče)
|
Objavljeno: Pon Jun 19, 2006 8:50 am Naslov sporočila: |
|
|
A na PC1 dobiš pravilne rezultate ?
_________________ Dokler bodo ljudje mislili, da živali ne čutijo, bodo živali čutile, da ljudje ne mislijo. |
|
Nazaj na vrh |
|
 |
cupacup Član

Pridružen-a: Tor 20 Jul 2004 21:28 Prispevkov: 68 Aktiv.: 0.29 Kraj: Tam kjer ma mraz mlade
|
Objavljeno: Pon Jun 19, 2006 12:24 pm Naslov sporočila: |
|
|
ne na nobenem vhodu ni pravilne vrednosti vsi porti so vhodi a,b in c pa še vedno nič, zanima me ali sploh pravilno kličem porte? z read__adc ali bi moral uporabiti za branje adc_data
|
|
Nazaj na vrh |
|
 |
CarpeDiem Član


Pridružen-a: Pon 16 Feb 2004 17:24 Prispevkov: 333 Aktiv.: 1.41 Kraj: Vrhnika
|
Objavljeno: Pon Jun 19, 2006 2:21 pm Naslov sporočila: |
|
|
Primer uporabe AD pretvorbe (h*tp://userweb.upctelemach.net/~u052009/):
Uporaba IC4511 (2x 7seg LED driver).
Uporaba Timer0 overflow interupta.
Na dveh 7seg LED se izpisuje rezultat AD pretvorbe (loop).
Izpisani rezultat je povprecje 20-ih meritev. Konstantnejsa meritev.
10k potenciometer je na PORTA.0.
Timer0 prescaler je nastavljen na Fosc/1024. Torej TCCR0=0x05 (101)
#n = (zeljeni cas * Fosc)/prescaler
V tem primeru pride do preliva vsakih ~5ms po priblizno ~15 urinih pulzov.
Zato moramo Timer0 TCNT0 po vsakem prelivu ponovno napolniti z
256 - 215 = 241 (0xF1).
Cas 5ms uporabimo za izmenicno priziganje 7segLED-ic.
V tem primeru je uporabljen 4MHz-ni kristal.
CodeVisionAVR C Compiler
(C) 2000-2002 HP InfoTech S.R.L.
www.hpinfotech.ro
Chip: Mega8535
Koda: |
// I/O register definitions for Mega8515
#include <Mega8535.h>
// Quartz crystal frquency [Hz]
#define xtal 4000000
#include <delay.h>
// Declare your global variables here
unsigned char vrednost = 0;
unsigned char toggle = 1;
unsigned char inc = 1;
unsigned char st1;
unsigned char st2;
unsigned char st1_e;
unsigned char st1_d;
unsigned char st2_e;
unsigned char st2_d;
unsigned int adc_data;
unsigned char adc_counter = 0;
unsigned int adc_sum = 0;
unsigned int adc_rez = 0;
#define ADC_VREF_TYPE 0x00
#define led1 PORTB.0
#define led2 PORTB.1
#define led3 PORTB.2
#define led4 PORTB.3
#pragma savereg-
// AD interrupt
interrupt [ADC_INT] void adc_isr(void)
{
#asm
push r26
push r27
push r30
push r31
in r30,sreg
push r30
#endasm
// Read the ADC conversion result
adc_data = ADCW;
// stevec AD pretvorb
adc_counter++;
ADMUX = 0;
#asm
pop r30
out sreg,r30
pop r31
pop r30
pop r27
pop r26
#endasm
}
#pragma savereg+
// Timer0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
//TCCR0=0x00; // prescaler 0
// Reinitialize Timer 0 value
TCNT0=0xF1; // vpisemo 256 - 15 = 241 -> 5ms
// vsak overflow prizgemo drugo 7segLED
if(toggle == 4)toggle = 0;
else toggle++;
// izracun stevilk za izpis
st2_d = 0; // 1. stevilka desetice
st2_e = 0; // 1. stevilka enice
st1_d = adc_rez/10; // 2. stevilka desetice
st1_e = adc_rez%10; // 2. stevilka enice
// Start the next ADC conversion
ADCSRA.6 = 1;
adc_sum = adc_sum + adc_data;
if(adc_counter == 20)
{
// izracun povprecja ADC
adc_rez = adc_sum / adc_counter;
// pretvorba iz merilnega obmocja 0 - 1024 na 0 - 51[°C]
adc_rez = adc_rez / 20;
// resetiranje spremenljivk
adc_sum = 0;
adc_counter = 0;
}
if(toggle == 1)
{
//prizgemo 1. led
led1 = 1; // aktiviraj 1. 7segLED
led2 = 0; // deaktiviraj 2. 7segLED
led3 = 0; // deaktiviraj 3. 7segLED
led4 = 0; // deaktiviraj 4. 7segLED
PORTC = st1_e; // output data
}
else if(toggle == 2)
{
//prizgemo 2. led
led1 = 0; // aktiviraj 1. 7segLED
led2 = 1; // deaktiviraj 2. 7segLED
led3 = 0; // deaktiviraj 3. 7segLED
led4 = 0; // deaktiviraj 4. 7segLED
PORTC = st1_d; // output data
}
else if(toggle == 3)
{
//prizgemo 1. led
led1 = 0; // aktiviraj 1. 7segLED
led2 = 0; // deaktiviraj 2. 7segLED
led3 = 1; // deaktiviraj 3. 7segLED
led4 = 0; // deaktiviraj 4. 7segLED
PORTC = st2_e; // output data
}
else if(toggle == 4)
{
//prizgemo 2. led
led1 = 0; // aktiviraj 1. 7segLED
led2 = 0; // deaktiviraj 2. 7segLED
led3 = 0; // deaktiviraj 3. 7segLED
led4 = 1; // deaktiviraj 4. 7segLED
PORTC = st2_d; // output data
}
//TCCR0=0x05; // prescaler 1024 -> TCCR0= 0b101
}
void main(void)
{
// Declare your local variables here
delay_ms(100);
// Input/Output Ports initialization
PORTC=0x00;
DDRC=0xFF; // all output
PORTB=0x00;
DDRB=0xFF; // all output
// ADC initialization
// ADC Clock frequency: 62,500 kHz
ADMUX = 0;
ADCSRA = 0xCF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4000,000 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x05; // prescaler 1024 -> TCCR0= 0b101
//TCNT0=0xE3; // vpisemo 256 - 29 = 227 (glej zgornji text)
TCNT0=0xF1; // 5ms pri 1024 prescalerju
OCR0=0x00; // output Compare Register
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01; // Timer0 Overflow Interrupt Enable (prescaler postavimo na 0)
// Global enable interrupts
#asm("sei")
//neskoncna zanka
while (1)
{
};
}
|
|
|
Nazaj na vrh |
|
 |
PrimozL Član


Pridružen-a: Tor 21 Mar 2006 10:55 Prispevkov: 404 Aktiv.: 1.72 Kraj: okolica Vipave
|
Objavljeno: Tor Jun 20, 2006 9:48 am Naslov sporočila: ADC na ATmega 8 |
|
|
Živijo,
Predlagam ti, da z vgrajenim čarovnikom generiraš najbolj osnovno kodo za ADC (brez prekinitev), jo preizkusiš, nadaljuješ s prekinitvami (če jih potrebuješ itn. Sam veliko uporabljam ADC in mi CVAVR nikoli ni delal težav (vedno sem si jih sam ).
Ko zadeva deluje, prekopiraš nastavitve registrov v svojo kodo in bo šlo. Po mojih izkušnjah je vgrajen čarovnik zelo dober.
LP Primož.
|
|
Nazaj na vrh |
|
 |
cupacup Član

Pridružen-a: Tor 20 Jul 2004 21:28 Prispevkov: 68 Aktiv.: 0.29 Kraj: Tam kjer ma mraz mlade
|
Objavljeno: Tor Jun 20, 2006 2:05 pm Naslov sporočila: |
|
|
Hval za pomoč, mi je uspelo z arduino naredit!
|
|
Nazaj na vrh |
|
 |
CarpeDiem Član


Pridružen-a: Pon 16 Feb 2004 17:24 Prispevkov: 333 Aktiv.: 1.41 Kraj: Vrhnika
|
Objavljeno: Tor Jun 20, 2006 4:49 pm Naslov sporočila: |
|
|
PrimožL:
Ko delam z AD pretvorbo se mi rezutat včasih vozi gor in dol (cca 2-4%). Zato ponavadi naredim več meritem in računam povprečje. Se to sliši znano?
|
|
Nazaj na vrh |
|
 |
mrsek Neznanec

Pridružen-a: Pon 06 Nov 2006 20:15 Prispevkov: 3 Aktiv.: 0.01
|
Objavljeno: Pon Nov 06, 2006 8:30 pm Naslov sporočila: Težava z RS232 |
|
|
Lep pozdrav.
Imam probelm, ki se za nekatere zdi banalen, sam pa sem zabil že kar precej časa. Nikakor mi na RS 232 ne uspe poslati "Hello world". Dobim samo xxx ... Uporabljam CodeVisionAVR in MEGA8.
Tu je še koda, ki je zgenerirana z čarovnikom.
Lp Matjaž
Koda: |
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.6 Professional
Automatic Program Generator
© Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com
Project :
Version :
Date : 6.11.2006
Author : F4CG
Company : F4CG
Comments:
Chip type : ATmega8
Program type : Application
Clock frequency : 4,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
// Standard Input/Output functions
#include <stdio.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// 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
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// 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
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
// 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
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 19200
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
while (1)
{
// Place your code here
printf("Hello world");
};
}
|
_________________ Če glava ne dela, telo trpi!! |
|
Nazaj na vrh |
|
 |
tejko Član

Pridružen-a: Pet 11 Feb 2005 12:57 Prispevkov: 108 Aktiv.: 0.46 Kraj: Pragersko
|
Objavljeno: Pon Nov 06, 2006 9:11 pm Naslov sporočila: |
|
|
Uporabljaš kvarz ali interni oscilator? Interni oscilator je načeloma preslab za asinhron prenos. Kateri terminal uporabljaš. Preveri, da je imaš nastavljeno pravilno bitno hitrost!
LP Matej
_________________ Vseh čarov čar, ELEKTRIČAR!! |
|
Nazaj na vrh |
|
 |
mrsek Neznanec

Pridružen-a: Pon 06 Nov 2006 20:15 Prispevkov: 3 Aktiv.: 0.01
|
Objavljeno: Pon Nov 06, 2006 9:21 pm Naslov sporočila: |
|
|
Uporabljam interni oscilator. Nastavitve so pa tudi pravilne. Zanimivo je, da če skopiram primer iz pomoči kjer se uporablja putchar in getchar rutina stvar dela. Ko tipkam se tekst izpisuje na terminal, tako da terminal naj bi delal.
Imaš kako idejo??
Lp Matjaž
_________________ Če glava ne dela, telo trpi!! |
|
Nazaj na vrh |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.71 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Tor Nov 07, 2006 11:38 am Naslov sporočila: |
|
|
Problem je lahko flow control. Podatki na RS232 port pridejo prehitro. Poizkusi zakasnitev (nekaj milisekund ali več) pri pošiljanju med posameznimi znaki. To da putchar deluje, dolg tekst pa ne, kaže na to, da pošiljaš prehitro.
Windowsi uporabljajo tri načine flow controla:
none (nič),
xoff/xon (controlS ustavi podatke, controlQ nadaljuje),
hardware (pretok podatkov se regulira z CTS/RTS ali DSR/DTR, to so poleg RX in TX ostale žice na modemskem/RS232 konektorju.
Če flow control na strani naprave (na primer mikrokontroler) in na strani PCja nista nastavljena prav, ali nista aktivna, lahko pride do težav. PC ni pripravljen sprejemati prevelike (ima manjhen buffer) ali prehitre količine podatkov (podatke je potrebno sproti brati). Flow control je edini način, da podatki ostanejo pravilni.
Napačne nastavitve terminala (speed, parity, stop biti...) lahko povzročijo, da so posamezni znaki pravilni. Poizkusi putchar z zaporedjem znakov. Na primer 1 2 3 4 5 6 (vsak z svojim putchar). Če dobiš na terminal 1 " 3 { 5 ~ (vsak drugi znak defekten), so napačne nastavitve terminala.
Načeloma se ne sliši logično, da bi PC ne zmogel prebrati nekaj bytov brez problema. Če ne poskrbiš za vse, je žal točno tako.
Smiley na priloženi sliki ima podplute oči, ker je večkrat stopil na grablje od COM porta.
Jur
Opis: |
|
Velikost datoteke: |
818 Bytov |
Pogledana: |
4232 krat |

|
|
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|