[delphi & AVR-asembly] adc mc -> uart -> delphi

Pagina: 1
Acties:

  • kippy
  • Registratie: September 2004
  • Laatst online: 21:52
Ik ben bezig met een projectje om via adc data in te lezen. deze data stuur ik rechtstreeks via de uart in de micro controllor door naar een rs232 naar usb convertor. deze convertor maakt een viritueele com aan op men pc. hierna lees ik de data van af men viritueele com in via delphi.

men adc staat op 8bit ingesteld en men uard stuurd ook 8 bit door.

ik heb hier informatie overdarcht alleen nu is het probleem dat ik geen binaire waardes terug krijg dis is ook logisch want com is alleen als byte in te lezen op delhpi

het geen wat er gebeurd is het volgende:

als ik men spanning op men adc van 0% tot 50% regel krijg is teld tie in delphi heel mooi op van 0 tot 256 (moet kunnen), wanneer ik nu van 50% tot 100% regel krijg ik weer 0 tot 256 binnen. dit vind ik niet helemaal logisch. ik stuur nammelijk maar een 8 bit code en ik weet zeker dat ik de juiste code naar de uart stuur. Ik heb deze code namelijk ook een keer rechtstreeks naar leds laten sturen. hier was ook echt 0% voeding 0b00000000 en 100% voeding 0b11111111.

heeft iemand eenig idee wat ik fout doe, waarom et niet werkt, of wat ik aan moet passen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
;Bas Jaspers
.device ATmega16
.include "M16def.inc"

;***=====ontvang sttings=============***
;licht = 0b100000001
;temp  = 0b100000010
;vocht = 0b100000100
;stof  = 0b100001000

;sens bestaant dus altijd uit 0b1xxxx**** dit ontvang ik van uit dhelphie
;*******=====voor ontvangen===****
.equ    wlicht      = 0b10000001
.equ    wthemp      = 0b10000010
.equ    wvocht      = 0b10000100
.equ    wstof       = 0b10001000

;*****======voor zenden=======*******
.equ    clicht      = 0b10000001
.equ    cstof       = 0b11000011
.equ    cvocht      = 0b11100111
.equ    cthemp      = 0b11111100
.equ    cready      = 0b00111111

;******=====regs====*****
.def    ADCin   = r18
.def    temp    = r19 
.def    sens    = r17
.def    dsens   = r16
.def ADCtemp = r24
.def ADCtemp2 = r25
.def ADCout = r23
.def ADCin = r22

.cseg
.org 0x000
rjmp reset 

reset:
hdw_init:   
        ldi temp,high(RAMEND)
        out SPH,temp 

        ldi temp,low(RAMEND)
        out SPL,temp
        
        ldi temp,0b00000000
        out DDRA,temp
        ldi temp,0b00000000
        out DDRB,temp
        ldi temp,0b00000000
        out DDRC,temp
        ldi temp,0b00000000
        out DDRD,temp
            
;******=====uart init====******
uart_init:  
    
        ldi temp,0x00 ;0b00000000
        out UCSRA,temp

        ldi temp,0x18 ;0b00011000
        out UCSRB,temp

;asyncroon, 1 stop bit, 8 databits, geen paraty
        ldi temp,0x86 ;0b10000011
        out UCSRC,temp
        
        ldi temp,0x00 ;0b00000000   ;baudrate
        out UBRRH,temp
        ldi temp,0x19 ;0b00011001   ;baudrate
        out UBRRL,temp
        
;ADCint1

;ADMUX refs1, refs0, adlar, mux4, mux3, mux2, mux1, mux0
;refs1 = 1 , gebruik interne 2,56V ref met externe C op AREF
;refs0 = 1 , gebruik interne 2,56V ref met externe C op AREF
;adlar = 1 , adc uitputlinks geschoven alleen ADCH (8bit)
;mux4..0 = channel en gain select
;ADC0 = 000
;ADC1 = 001
;ADC2 = 010
;ADC3 = 011
;ADC4 = 100
;ADC5 = 101
;ADC6 = 110
;ADC7 = 111
ldi ADCtemp, 0b11100000
out ADMUX, ADCtemp

;ADCint2

;ADCSRA ADEN, ADSC, ADATE, ADIF, ADIE, ADPS2, ADPS1, ADPS0
;ADEN =  1 , zet ADC aan
;ADSC =  1 , start ADC
;ADATE = 1 , free run
;ADIF =  0 , voor free run mode (pol op dit, wanneer 0, leer reg uit)
;ADIE =  1 , converzatie compleet interupt

;prescale = 4m / 16 = 250k
;ADSP2 = 0
;ADSP1 = 1
;ADSP0 = 1

ldi ADCtemp, 0b11110011
out ADCSR, ADCtemp      

        sei 
main:                      [b]//alles hierboven is initialisatie[/b]

ready1:     
        in ADCin, ADCH   //haal data uit ADC en zet in ADCin

        sbis    UCSRA,UDRE       //zend alleen als zend buffer leeg is
        rjmp    ready1        //asl zend buffer niet leef is zend niet
        out UDR,ADCin      //zend data via uart
        jmp main


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
unit test;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,PortInc,ExtCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
const
    COM3 : integer = $03E8;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
     ind : integer;
begin
   OpenCom (Pchar('COM3:9600,N,8,1'));       //initialisatie compoort
     ind := READBYTE;                       //lees data in
     DTR(1);                       //klaar om data te ontvangen?
     Edit1.Text := FloatToStr(ind);
     Button1.Click (); {:= OnClick; }
end;

end.

[ Voor 5% gewijzigd door kippy op 08-12-2004 13:25 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:44

Creepy

Tactical Espionage Splatterer

Uit je code zo kan ik geen wijs. Je asm code kom ik niet echt uit omdat ik het apparaat niet ken. En je Delphi code kom ik niet uit omdat daar nogal wat mist (wat is READBYTE, wat is DTR etc.).

Kan je alleen de relevante (!!) code posten + uitleg van je code

Ik gok dat je Delphi code domweg 1 byte print. Laat je Delphi code eens continu de gelezen bytes afdrukken (bijv in een Memo veld) zodat je precies kan zien wat er binnenkomt.

Lees ook eens P&W FAQ - Leer **** debuggen!! :)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • kippy
  • Registratie: September 2004
  • Laatst online: 21:52
code geedit in begin post

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 19-05 12:05

Tomatoman

Fulltime prutser

Je hebt nog steeds niet beantwoord wat READBYTE en DTR doen :)

Verder gooi je je datatypes hopeloos door elkaar. Ik gok dat READBYTE een waarde teruggeeft in de vorm van een byte (een 8-bits integer). Die stop je vervolgens in een Integer (een 32-bits integer). Daarna gebruik je FloatToStr, dat een floating-point getal als parameter verwacht.

Met Button1.Click roep je indirect Button1Click aan, zodat je een eindeloze, recursieve lus creëert (bug!). Waarschijnlijk zal dit na een tijdje resulteren in een stack overflow. Bovendien initialiseer je met OpenCom iedere keer opnieuw de COM-poort (dat is tenminste wat ik vermoed, graag uitleg), terwijl het me logisch lijkt dat dat maar één keer hoeft te gebeuren.

Een goede grap mag vrienden kosten.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
kippy schreef op woensdag 08 december 2004 @ 12:58:
.... en ik weet zeker dat ik de juiste code naar de uart stuur. Ik heb deze code namelijk ook een keer rechtstreeks naar leds laten sturen. hier was ook echt 0% voeding 0b00000000 en 100% voeding 0b11111111.
En dat is ook wat Delphi laat zien. Je hebt namelijk nog niet afgekaart of 50% voeding wel echt 0x0F is.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • kippy
  • Registratie: September 2004
  • Laatst online: 21:52
farlane schreef op woensdag 08 december 2004 @ 15:37:
[...]


En dat is ook wat Delphi laat zien. Je hebt namelijk nog niet afgekaart of 50% voeding wel echt 0x0F is.
Jawel, ik heb dit op led's getest. staat ook in men begin post.
Misschien heb je hier wat aan?

Docklight RS232 Terminal - RS232 Monitor 1.4

Look RS232
ik zal eens gaan kijken.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
kippy schreef op woensdag 08 december 2004 @ 15:53:
Jawel, ik heb dit op led's getest. staat ook in men begin post.
Nee dat staat er niet. Er staat dattie bij 0% 0x00 is en bij 100% 0xFF. Niet dat ie bij 50% 0x0F is.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 19-05 12:05

Tomatoman

Fulltime prutser

farlane schreef op woensdag 08 december 2004 @ 20:40:
[...]


Nee dat staat er niet. Er staat dattie bij 0% 0x00 is en bij 100% 0xFF. Niet dat ie bij 50% 0x0F is.
Waarschijnlijk wordt hier $7F bedoeld in plaats van $0F. $7F (127) is immers de helft van $FF (255).

Een goede grap mag vrienden kosten.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
tomatoman schreef op woensdag 08 december 2004 @ 20:53:
[...]
Waarschijnlijk wordt hier $7F bedoeld in plaats van $0F. $7F (127) is immers de helft van $FF (255).
*kuch* U hebt natuurlijk gelijk :D

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • kippy
  • Registratie: September 2004
  • Laatst online: 21:52
oke, ik heb het nog een keer nagekeken. Maar aan men ADC licht het niet. 0% is heel netjes alle leds uit 50% is heel netjes 7 leds aan 0b01111111 en 100% is heel netjes alles leds aan. dus nog maals dat werkt. er zit gewoon ergens een fout met het ophalen van de data van men compoort. Ik heb die aanroep naar die button onclick wegehaal want dat gaf inderdaat een overflow.

ik heb ook al geprobeert om data in te lezen met behulp van "Cport" libari maar dat wil niet helemaal lukken.

heeft imand meschien nog andere code of iets om data van com poort in te lezen?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:44

Creepy

Tactical Espionage Splatterer

Met die libraries heb je genoeg code om de seriele poort uit te lezen. Het ligt ook niet aan de gebruikte libs maar toch echt ergens aan jouw code.

Heb je nu al geprobeerd om continu te lezen en dat te loggen naar een file (of desnoods in een tmemo?) zodat je precies weet wat er wanneer wordt gestuurd? Want zo kom je echt geen stap verder.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Virgil
  • Registratie: November 2001
  • Laatst online: 17-05 20:10

Virgil

We're not alone

Hmm, het gaat dus echt mis bij het versturen van je data naar de computer.

Dat ligt aan je UART initialisatie. Ik ken geen delphi, en heb geen zin om me in te lezen in je code. Maar ik kuch iets met een timer, een baudrate en de clocksnelheid.
Waarom ligt het aan die dingen? Toen wij onze baudrate van de uC op een waarde die te hoog was werden de tekens vervormd.
Toen we de baudrate te laag hadden kwam er niets op het scherm.

Ik zal zo even naar je code kijken. Maar maak je gebruik van timers? Welke controller gebruik je en welke kloksnelheid draait ie?

Ik was heel, heeeel vroeger SeRRveR


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 19-05 12:05

Tomatoman

Fulltime prutser

Nee, hij maakt geen gebruik van timers. Hij gebruikt een eindeloze lus, waarvan de frequentie waarmee hij doorlopen wordt afhangt van de processorsnelheid. Het principe van deze lus deugt trouwens niet, zoals ik al eerder aangegeven had.

Een goede grap mag vrienden kosten.


  • Virgil
  • Registratie: November 2001
  • Laatst online: 17-05 20:10

Virgil

We're not alone

tomatoman schreef op woensdag 08 december 2004 @ 23:33:
Nee, hij maakt geen gebruik van timers. Hij gebruikt een eindeloze lus, waarvan de frequentie waarmee hij doorlopen wordt afhangt van de processorsnelheid. Het principe van deze lus deugt trouwens niet, zoals ik al eerder aangegeven had.
Ik heb even de code bekeken. Ik ken geen delphi. Maar ik kan aanwijzen waar hoogstwaarschijnlijk ook de fout kan liggen.

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
uart_init:    
    
        ldi    temp,0x00 ;0b00000000
        out    UCSRA,temp

        ldi    temp,0x18 ;0b00011000
        out    UCSRB,temp

;asyncroon, 1 stop bit, 8 databits, geen paraty
        ldi    temp,0x86 ;0b10000011
        out    UCSRC,temp
        
        ldi    temp,0x00 ;0b00000000    ;baudrate
        out    UBRRH,temp
        ldi    temp,0x19 ;0b00011001    ;baudrate
        out    UBRRL,temp


De waardes die je in je registers stopt. Download de datasheet van je controller. Most likely gebruik je een atmega32(3) en kan je beginnen te lezen van de datasheet op pagina 138. Zorg dat de waardes die je inlaadt in je controller overeenkomen met de kloksnelheid en de baudrates die erbij mogelijk zijn!
Dit hadden wij eerst niet en daardoor moesten wij switchen van een baudrate van 19200 naar 9600.

Onze UART init ziet er als volgt uit;
C:
1
2
3
4
5
6
7
void vUartInit (void)
{
  UCSRB  = 0x08;        
  UBRRH  = 0x00;
  UBRRL  = 0x33;   // 0x33 , baud rate 9600 bps at a cpu speed of 4 mhz.
  // Take a look at page 165 of the atmega32 datasheet for detailled tables with baud rate settings. 
}

Ik was heel, heeeel vroeger SeRRveR


  • kippy
  • Registratie: September 2004
  • Laatst online: 21:52
ok ik gebruik een atmel Mega 16 en men boutrate is 9600 boud. en ik laat em lopen op een 4MHz crystal.

baudconstante=(Fck/(16*baudrate))+1 = 27 = 0x1B

snap der nix can had et 3 keer nagerekend, maar ik zal volgende week ff aanpassen en kijken of het helpt. heb verloopig ff geen tijd. Heel erg bedankt in iedergeval.
Pagina: 1