As requested ...
want proof ??? Ok ... let's go !
1St attempt : Mikrobasic 7.2 ...
Code:
program Gouvernail ' program PiloteAT50
'************************************************* ****************************
' microcontroleur : 16F819 sur EasyPic 5
'
' Projet : PPE 2010
'
' En entree : A0 Up3 = entree analogique
'
' En sortie : portB Affichage des consignes "Babord et Tribord" sur lcd
'
'************************************************* ****************************
'program PiloteAT50
symbol Up3 = PORTA.0 ' tension analogique (<5V)
' déclaration des variables
dim result as word
dim tension as longint
dim angle as longint
dim text as string[9]
dim valeur as string[11]
const Vref = 5000
'******************************************************************************
sub Procedure Init ' Initialisation
'CMCON = 7
trisb = %00000000 ' portB en sortie
trisa = %11111111 ' portA en entrée
Delay_ms(500)
Lcd_Config(PORTB, 3, 2, 1, 0, PORTB, 4, 6, 5) ' Initialize LCD connected to PORTB
'LCD_init(PORTB) ' initialisation Lcd sur PortB
Lcd_Cmd(lcd_Clear)
Lcd_Cmd(lcd_cursor_off)
end sub
'*******************************************************************************
main: ' ********* Principal *********
'*******************************************************************************
Init ' config. et init. du PIC
while true ' début de la boucle
result = adc_read(0)
tension = result * Vref /1024 ' en mv !!!
'**************************************************************************
' < ou > 4.02 v ??? ( 1024 * 4.02/5 = 823 !!! )
if tension < 4020 then
text = " Tribord "
else
Text = " Babord "
end if
'*****************************************************************************
' Calcul de l'angle
angle = 3133 * Fabs(tension - 4020) / 120000
'*****************************************************************************
' Affichage
LongintTostr(angle,valeur)
Lcd_out(1, 1, text)
Lcd_out(2,1,valeur)
delay_ms(100)
wend
end.
1:1 E-0 Linker error: NOT ENOUGH ROM
NOTA: 2504 Words compiled for a 16F877A
2nd Attempt : MikroBasic 7.2 ... NOT USING Fabs () ... = PbP ABS()
Code:
program Gouvernail ' program PiloteAT50
'************************************************* ****************************
' microcontroleur : 16F877A sur EasyPic 5
'
' Projet : PPE 2010
'
' En entree : A0 Up3 = entree analogique
'
' En sortie : portB Affichage des consignes "Babord et Tribord" sur lcd
'
'************************************************* ****************************
'program PiloteAT50
symbol Up3 = PORTA.0 ' tension analogique (<5V)
' déclaration des variables
dim result as word
dim tension as longint
dim angle as longint
dim text as string[9]
dim valeur as string[11]
const Vref = 5000
'******************************************************************************
sub Procedure Init ' Initialisation
' CMCON = 7
trisb = %00000000 ' portB en sortie
trisa = %11111111 ' portA en entrée
Delay_ms(500)
Lcd_Config(PORTB, 3, 2, 1, 0, PORTB, 4, 6, 5) ' Initialize LCD connected to PORTB
'LCD_init(PORTB) ' initialisation Lcd sur PortB
Lcd_Cmd(lcd_Clear)
Lcd_Cmd(lcd_cursor_off)
end sub
'*******************************************************************************
main: ' ********* Principal *********
'*******************************************************************************
Init ' config. et init. du PIC
while true ' début de la boucle
result = adc_read(0)
tension = result * Vref /1024 ' en mv !!!
'**************************************************************************
' < ou > 4.02 v ??? ( 1024 * 4.02/5 = 823 !!! )
if tension < 4020 then
text = " Tribord "
angle = 3133 * (4020 - tension ) / 120000
else
Text = " Babord "
angle = 3133 * (tension - 4020) / 120000
end if
'*****************************************************************************
' Calcul de l'angle
' angle = 3133 * Fabs(tension - 4020) / 120000
'*****************************************************************************
' Affichage
LongintTostr(angle,valeur)
Lcd_out(1, 1, text)
Lcd_out(2,1,valeur)
delay_ms(100)
wend
end.
0:0 S-100 Success (Release build) - Timestamp: 10:15:57
0:0 W-101 Used ROM: 1774 (86%) Used RAM: 80 (31%)
0:0 W-102 Free ROM: 273 (14%) Free RAM: 176 (69%)
a small bit better ...
3rd attempt : MikroBasic PRO 3.2
Code:
program Gouvernail
' program PiloteAT50
'************************************************* ****************************
' microcontroleur : 16F819 sur EasyPic 5
'
' Projet : PPE 2010
'
' En entree : A0 Up3 = entree analogique
'
' En sortie : portB Affichage des consignes "Babord et Tribord" sur lcd
'
'************************************************* ****************************
'program PiloteAT50
' Lcd module connections
dim LCD_RS as sbit at RB4_bit
LCD_EN as sbit at RB5_bit
LCD_D4 as sbit at RB0_bit
LCD_D5 as sbit at RB1_bit
LCD_D6 as sbit at RB2_bit
LCD_D7 as sbit at RB3_bit
LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit
' End Lcd module connections
' Symbol Up3 = PORTA.0 ' tension analogique (<5V)
' déclaration des variables
dim resulta as word
dim tension as longint
dim angle as longint
dim text as string[9]
dim valeur as string[11]
const Vref = 5000
'*******************************************************************************
main:
'*******************************************************************************
' Init ' config. et init. du PIC
' CMCON = 7
trisb = %00000000 ' portB en sortie
trisa = %11111111 ' portA en entrée
Delay_ms(500)
'Lcd_Config(PORTB, 3, 2, 1, 0, PORTB, 4, 6, 5) ' Initialize LCD connected to PORTB
LCD_init() ' initialisation Lcd sur PortB
Lcd_Cmd(_LCD_CLEAR)
Lcd_Cmd(_Lcd_Cursor_Off)
while true ' début de la boucle
resulta = adc_read(0)
tension = resulta * Vref /1024 ' en mv !!!
'************************************************************************
' < ou > 4.02 v ??? ( 1024 * 4.02/5 = 823 !!! )
if tension < 4020 then
text = " Tribord "
'*********************************************************************
' Calcul de l'angle
angle = 3133 * ( 4020 - tension ) / 120000
else
Text = " Babord "
angle = 3133 * (tension - 4020) / 120000
end if
'*****************************************************************************
' Affichage
LongintTostr(angle,valeur)
Lcd_out(1, 1, text)
Lcd_out(2,1,valeur)
delay_ms(100)
wend
end.
0 133 Compiled Successfully C:\Program Files\Mikroelektronika\ProjetsBPro\Gouvernail\Gouv ernail.mbas
0 1143 Used ROM (program words): 1722 (84%) Free ROM (program words): 326 (16%)
0 1143 Used RAM (bytes): 44 (18%) Free RAM (bytes): 196 (82%)
a tiny little bit better ...
4Th attempt : Our favourite PicBasicPro v 2.60 / MPASM/ MCS ( left MkB lines commented besides PbP lines ...)
Code:
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 30/04/2010 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
'program Gouvernail ' program PiloteAT50
'************************************************* ****************************
' microcontroleur : 16F819 sur EasyPic 5
'
' Projet : PPE 2010
'
' En entree : A0 Up3 = entree analogique
'
' En sortie : portB Affichage des consignes "Babord et Tribord" sur lcd
'
'************************************************* ****************************
'program PiloteAT50
@ ERRORLEVEL -306
@ __config _HS_OSC & _WDT_ON & _PWRTE_ON & _BODEN_ON & _LVP_OFF & _CP_OFF
entree var PORTA.0 ' tension analogique (<5V)
' déclaration des variables
' dim result as word
' dim tension as longint
' dim angle as longint
' dim text as string[9]
' dim valeur as string[10]
' const Vref = 5000
result var word
tension var word
angle var word
dummy var word
vref con 5000
'************************************************* *****************************
'sub Procedure Init ' Initialisation
DEFINE OSC 8
CLEAR
;----[LCD definitions]------------------------------------------------------
DEFINE LCD_DREG PORTB ' LCD Data port
DEFINE LCD_DBIT 0 ' starting Data bit (0 or 4)
DEFINE LCD_EREG PORTB ' LCD Enable port
DEFINE LCD_EBIT 5 ' Enable bit (on EasyPIC 5 LCD)
DEFINE LCD_RSREG PORTB ' LCD Register Select port
DEFINE LCD_RSBIT 4 ' Register Select bit (on EasyPIC 5 LCD)
DEFINE LCD_BITS 4 ' LCD bus size (4 or 8 bits)
DEFINE LCD_LINES 2 ' number of lines on LCD
DEFINE LCD_COMMANDUS 2000 ' Command delay time in us
DEFINE LCD_DATAUS 50 ' Data delay time in us
;----[LCD definitions]------------------------------------------------------
DEFINE ADC_BITS 10 ' set number of bits in result
DEFINE ADC_CLOCK 3 ' set clock source
ADCON1 = %10000000 ' right formatted
' CMCON = 7
trisb = %00000000 ' portB en sortie
trisa = %11111111 ' portA en entrée
'Delay_ms(500)
PAUSE 500
'Lcd_Config(PORTB, 3, 2, 1, 0, PORTB, 4, 6, 5) ' Initialize LCD connected to PORTB
'LCD_init(PORTB) ' initialisation Lcd sur PortB
' Lcd_Cmd(lcd_Clear)
' Lcd_Cmd(lcd_cursor_off)
LCDOUT $FE,1
' end sub
'************************************************* ******************************
main: ' ********* Principal *********
'************************************************* ******************************
' Init ' config. et init. du PIC
'while true ' début de la boucle
while 1=1
' result = adc_read(0)
adcin 0, result
dummy = result * Vref
tension = DIV32 1024 ' en mv !!!
'************************************************* *************************
' < ou > 4.02 v ??? ( 1024 * 4.02/5 = 823 !!! )
if tension < 4020 then
LCDOUT $FE,2, " Tribord "
else
LCDOUT $FE,2, " Babord "
endif
'************************************************* ****************************
' Calcul de l'angle
' angle = 3133 * abs(tension - 4020) / 120 / 1000
dummy = 3133 * abs(tension - 4020)
angle = DIV32 12000
angle = angle /10
'************************************************* ****************************
' Affichage
' LongintTostr(angle,valeur)
' Lcd_out(1, 1, text)
' Lcd_out(2,1,valeur)
LCDOUT $FE, $C0, dec3 angle
' delay_ms(100)
PAUSE 100
wend
end
Success ; 461 Words ...
Really astonishing for such a simple work !!!, don't you think ???
Alain
PS; as we are under the 2K limit EVERYONE can verify it with the Demo available versions of MikroBasic and MikroBasic Pro ...
Bookmarks