Hallo iedereen
Ik heb juist een programma geschreven in de PIC die de ADC inleest en dan doorstuurt naar mijn UART naar mijn laptop maar ik krijg enkel van die rare tekens dus hij werkt de communicatie.
Wat ik graag wil zien op mijn terminal is als ik de spanning van 0V tot 5V regel op mijn board dat er op mijn terminal dat ook verschijnt
Hoe kan ik dat verwezenlijken?. Op mijn LCD scherm krijg ik wel die spanning erop maar dan zonder USART
Kan iemand mij eens vertellen hoe je dat moet doen
moet ik ergens +0x30 optellen bij die byte die wordt verstuurd
Ik probeer dat:
unsigned short temp_res;
long tlong;
unsigned char ch;
void main() {
USART_Init(19200); // Initalize USART (19200 baud rate, 1 stop bit, no parity...)
// Select Vref and analog inputs, in order to use ADC_Read
ADCON1 = 0; // All PORTA pins as analog, VDD as Vref
TRISA = 0xFF; // PORTA is input
do {
temp_res = ADC_Read(2) >> 2; // Read 10-bit ADC from AN2 and discard 2 LS bits
tlong = (long) temp_res * 5000;
tlong /= 1023;
ch = tlong / 1000;
USART_Write(ch + 0x30);
Delay_ms(500);
ch = (tlong / 100) % 10; // extract 0.1 volts digit
USART_Write(ch + 0x30);
Delay_ms(500);
ch = (tlong / 10) % 10; // extract 0.01 volts digit
USART_Write(ch + 0x30);
Delay_ms(500);
ch = tlong % 10; // extract 0.001 volts digit
USART_Write(ch + 0x30);
Delay_ms(500);
} while (1); // endless loop
}
Ik krijg wel degelijk cijfers op het scherm maar ik wil bvb 5.145V hebben, hoe kan ik dat zodanig aanpassen dat het mij lukt dat te hebben?
Hoe tekst sturen naar de PC
-
- Berichten: 11
- Lid geworden op: ma 6 apr 2009, 15:33
- Locatie: GENT
- Stynus
- Site Admin
- Berichten: 5910
- Lid geworden op: vr 16 mei 2003, 20:45
- Locatie: Overpelt (België)
- Contacteer:
Je zal die long eerst moeten omzetten naar eens string dan. Als je nu bijvoorbeeld 22 doorzend dan gaat de pc dit opzoeken in zijn ASCII tabel en geeft het teken dat bij 22 hoort weer.
Met vriendelijke groet,
Stynus
http://www.elektronicastynus.be
--> Elektronica bouwpakketten en componenten te koop. <--
Stynus
http://www.elektronicastynus.be
--> Elektronica bouwpakketten en componenten te koop. <--
-
- Berichten: 11
- Lid geworden op: ma 6 apr 2009, 15:33
- Locatie: GENT
Hallo Stynus
Ik heb ondertussen die functie gevonden om van een long naar een string te gaan en dan deze string doorsturen naar de USART.
Vraag 1
=====
Wat ik mij afvraag waarom moet dat steeds een array zijn van 6 elementen en geen 7 elementen?
Heeft dat te maken met het '/0' character?
Dus moet blijkbaar unsigned char text[5]; declareren
Nu krijg tenminste geen rare tekens meer
Vraag 2
=====
De interne interne ADC van de microcontroller 16F877A
Deze geeft een interne ADC en deze zet om 0..1023 stappen.
Ik gebruik een reference spanning van 3V
Eerst bepaal ik de stapspanning :
stap_voltage = Vref / 1023 = 3V / 1023 = 2.93mV / stap
Ik programmeer dit als volgt :
temp_res = ADC_Read((0) * 1000.0) / 1023;
Mijn vraag is mag ik dat zo doen? en wat wordt er dan eigenlijk berekend?
Vraag 3:
======
Is mijn algoritme juist voor het zenden en ontvangen van een byte en kan ik het universeel gaan gebruiken
Mag ik dat doen die if en dan nog een repeat om te testen als er een byte
toekomst of verzonden is
Kan ik dat later in een interrupt handler plaatsen en wat moet ik dan testen ik veronderstel stel die vlaggen TXIF en de RCIF
Met vriendelijke groet
S
Ik heb ondertussen die functie gevonden om van een long naar een string te gaan en dan deze string doorsturen naar de USART.
Vraag 1
=====
Wat ik mij afvraag waarom moet dat steeds een array zijn van 6 elementen en geen 7 elementen?
Heeft dat te maken met het '/0' character?
Dus moet blijkbaar unsigned char text[5]; declareren
Nu krijg tenminste geen rare tekens meer
Vraag 2
=====
De interne interne ADC van de microcontroller 16F877A
Deze geeft een interne ADC en deze zet om 0..1023 stappen.
Ik gebruik een reference spanning van 3V
Eerst bepaal ik de stapspanning :
stap_voltage = Vref / 1023 = 3V / 1023 = 2.93mV / stap
Ik programmeer dit als volgt :
temp_res = ADC_Read((0) * 1000.0) / 1023;
Mijn vraag is mag ik dat zo doen? en wat wordt er dan eigenlijk berekend?
Vraag 3:
======
Is mijn algoritme juist voor het zenden en ontvangen van een byte en kan ik het universeel gaan gebruiken
Mag ik dat doen die if en dan nog een repeat om te testen als er een byte
toekomst of verzonden is
Kan ik dat later in een interrupt handler plaatsen en wat moet ik dan testen ik veronderstel stel die vlaggen TXIF en de RCIF
Code: Selecteer alles
void Send_Byte(unsigned char tx_byte)
{
UART1_Write(Lo(tx_byte));
UART1_Write(Hi(tx_byte));
}
unsigned char Read_Byte()
{
do
{
if(UART1_Data_Ready() == 1)
{
return(UART1_Read());
}
{
while(UART1_Data_Ready() != 1);
}
S
- Stynus
- Site Admin
- Berichten: 5910
- Lid geworden op: vr 16 mei 2003, 20:45
- Locatie: Overpelt (België)
- Contacteer:
Vraag 1 ligt denk ik aan je compiler
Vraag 2 heb ik geen antwoord op
Vraag 3 Geen idee hangt van je compiler af.
Interupt kan. Hoe in C? geen idee.
Vraag 2 heb ik geen antwoord op
Vraag 3 Geen idee hangt van je compiler af.
Interupt kan. Hoe in C? geen idee.
Met vriendelijke groet,
Stynus
http://www.elektronicastynus.be
--> Elektronica bouwpakketten en componenten te koop. <--
Stynus
http://www.elektronicastynus.be
--> Elektronica bouwpakketten en componenten te koop. <--