Goeden dag, mijn naam is Theo en zit met het volgende probleem.
ik ben bezig met het vervaardigen van een L/C meter waarvoor er een stukje software in een atmega328/p geschreven moet worden, echter ben ik niet thuis in het werken met bascom, het zou volgens de uitleg mogelijk moeten zijn om de file in de chip te kunnen uploaden mbh van een arduino (mocht dit niet correct zijn hoor ik graag met welke programmer je dat dan wel kan doen), Ik kan wel het bestand compilen en daarna uploaden naar de atmega, echter zonder dat ik een foutmelding krijg blijft wel het error lampje op de isp branden, verder moet ik de fusebits aanpassen.
Fusebits Low: FF
Fusebits High: D9
Fusebits Extended: FF, ook dit wil niet lukken, het gaat om onderstaande code, mocht iemmand een oplossing weten dan hoor ik het graag
mvg. Theo
'--------------------------------------------------------------------------------------------------------
' LC Meter Firmware
' June 2020 - coreWeaver / ioCONNECTED
'--------------------------------------------------------------------------------------------------------
' Copyright <2020> <coreWeaver / ioCONNECTED>
' Permission is hereby granted, free of charge,
' to any person obtaining a copy of this software and associated documentation files (the "Software"),
' to deal in the Software without restriction, including without limitation the rights to use,
' copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
' and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
' The above copyright notice and this permission notice shall be included in all copies or
' substantial portions of the Software.
' The Software Is Provided "AS IS" , Without Warranty Of Any Kind , Express Or Implied ,
' Including But Not Limited To The Warranties Of Merchantability , Fitness For A Particular Purpose
' And Noninfringement. In No Event Shall The Authors Or Copyright Holders Be Liable For Any Claim ,
' Damages Or Other Liability , Whether In An Action Of Contract , Tort Or Otherwise , Arising From ,
' Out Of Or In Connection With The Software Or The Use Or Other Dealings In The Software.
'--------------------------------------------------------------------------------------------------------
'--------------------------------------------------------------------------------------------------------
$regfile = "m328pdef.dat"
$crystal = 8000000
$baud = 19200
$hwstack = 256
$swstack = 256
$framesize = 256
' UART Config
Config Com1 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com1:" For Binary As #1
Config Serialin0 = Buffered , Size = 30 , Bytematch = All
' Use ADC's Channel_5 to measure VBAT
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
'using watchdog for SW RST
Config Watchdog = 128 'ovf after 128ms and resets the uC
' Timers Usage:
' Timer0 is used to count the incoming pulses on T0 (PD4)
' Timer1 is used to generate a 1sec time interval for frequency measurement
' Timer2 is used to raise a flag (Ok_to_read_Vbat) every 4 seconds
' Frequency Counter from 4 Hz to 5 MHz
' Timer1 Config (1 Second time interval)
On Timer1 Timer1_routine
Tccr1a = &B00000000
Tccr1b = &B00000101 ' Prescaller 1024
Timsk2 = &B00000001 ' Interrupt for Timer 2 active
Timsk1 = &B00000001 ' Interrupt for Timer 1 active
Timsk0 = &B00000001 ' Interrupt for Timer 0 active
Sreg = &B10000000 ' Global Interrupts on
Timer1 = 57644
' this value was found by using a resonator (4MHz)
' and adjusting the value of timer1 to match the 4000000 Hz output
' Timer0 Config
On Timer0 Timer0_routine
Tccr0 = &B00000111 ' Count external Signals on Rising Edge
' Timer2 Config (read and display the battery voltage every 4 seconds)
On Timer2 Timer2_routine
Tccr2a = &B00000000
Tccr2b = &B00000101 ' Prescaller 1024
Timer2 = 178 ' OVF each 10 ms
' count 4 seconds in INT routine then raise Ok_to_read_vbat Flag
Enable Interrupts
$lib "glcd-Nokia3310.lib"
' LCD Rst & Cs1 are not used
Config Graphlcd = 128x64sed , Rst = Portd.3 , A0 = Portb.4 , Si = Portb.3 , Sclk = Portb.5
'Const Negative_lcd = 1 ' Invert screen
Const Rotate_lcd = 0
' LEDs
Config Portd.5 = Output
Blue_led Alias Portd.5
Reset Blue_led
Config Portd.6 = Output
Red_led Alias Portd.6
Reset Red_led
' Keys
Config Pinb.1 = Input
Key1 Alias Pinb.1
Portb.1 = 1
Config Pind.2 = Input
Key2 Alias Pind.2
Portd.2 = 1
' Reed Relay (adds Calibration Capacitor)
Config Portb.2 = Output
Calibrate Alias Portb.2
Set Calibrate ' disconnect Ccal
' Measure Mode
' double relay
' SET (Normally Open) >> C Mode
' RESET (Normally Close) >> L Mode
Config Portb.0 = Output
Measure_mode Alias Portb.0
Reset Measure_mode
Dim Overflowed As Long
Dim Pulses As Long
Dim I As Byte , J As Byte , K As Byte
Dim Tim2var As Integer
Const Pi = 3.141592653589793
Const 2pi = 6.283185307179586
Const Ccal = 0.000000001006 ' Farads or 1006 [pF]
Const Milli = 0.001
Const Micro = 0.000001
Const Nano = 0.000000001
Const Pico = 0.000000000001
Const Cr = &H0D
Const Lf = &H0A
Dim F1 As Single ' Oscillator's base freq. (Ccal, C_det & L_det disconnected)
Dim F2 As Single ' Calibration freq. (Ccal connected, C_det & L_det disconnected)
Dim F3 As Single ' Ccal disconnected, C_det connected, L_det disconnected
Dim F4 As Single ' Ccal disconnected, C_det disconnected, L_det disconnected
Dim Dvar1 As Single
Dim Dvar2 As Single
Dim Svar1 As Single
Dim C_measured As Single
Dim L_measured As Single
Dim Scaled_val As Single
Dim New_str_value As String * 20
Dim Adcval As Word
Dim Vbat As Single
Dim Vbat_str As String * 5
Dim X As Byte
Dim Lbat_pic As Bit
Reset Lbat_pic
Dim Ok_to_read_vbat As Bit
Reset Ok_to_read_vbat
Dim A As Byte
Dim Rx_buffer As String * 30 , Rx_string As String * 30
Dim Full_buffer As Bit , Rx_flag As Bit
Reset Full_buffer : Reset Rx_flag
Declare Sub Read_vbat
Declare Sub Calibration
Declare Sub Measure_c
Declare Sub Measure_l
Declare Sub Convert(value As Single)
' Initialize LCD
Initlcd
Glcdcmd 33 : Glcdcmd 200 ' Normal Contrast
Cls
' select Capacity Mode
Set Measure_mode
Print "LC-Meter.ioConnected.OK"
Setfont Newfont6x8
Showpic 1 , 1 , Splash
Waitms 1000
Cls
Lcdat 3 , 10 , "ioConnected"
Lcdat 4 , 52 , "2020"
Waitms 2000
Print "Ready"
Waitms 500
Call Calibration
Print
Print
Do
If Ok_to_read_vbat = 1 Then Call Read_vbat
If Key1 = 0 Then
Print "Measuring Capacitance >>>>"
Waitms 500
If Key2 = 0 Then
Call Calibration
Else
Call Measure_c
End If
End If
If Key2 = 0 Then
Print "Measuring Inductance >>>>"
Waitms 500
If Key1 = 0 Then
Call Calibration
Else
Call Measure_l
End If
End If
If Rx_flag = 1 Then
Select Case Rx_string
Case "rst!":
Start Watchdog
End Select
End If
Loop
End
$include "newfont6x8.font"
$include "font12x16dig.font"
Splash:
$bgf "splash_s.bgf"
Battery100:
$bgf "b100.bgf"
Battery75:
$bgf "b75.bgf"
Battery50:
$bgf "b50.bgf"
Batterylow1:
$bgf "blow1.bgf"
Batterylow2:
$bgf "blow2.bgf"
Inductor:
$bgf "ind_s.bgf"
Capacitor:
$bgf "cap_s.bgf"
Serial0bytereceived:
Pushall
If Ischarwaiting() > 0 Then
A = Inkey()
If A <> 10 And A <> 13 Then
Rx_buffer = Rx_buffer + Chr(a)
End If
If Len(rx_buffer) >= 20 Then Set Full_buffer
End If
If A = 10 Or Full_buffer = 1 Then
Reset Full_buffer
Set Rx_flag
Rx_string = Rx_buffer
Rx_buffer = ""
End If
Popall
Return
Timer1_routine:
'Timer1 = 57898
'Timer1 = 57880
'Timer1 = 57870
Timer1 = 57644
Overflowed = Overflowed * 255
Pulses = Overflowed + Timer0
Overflowed = 0
Timer0 = 0
Return
Timer0_routine:
Incr Overflowed
Return
Timer2_routine:
Timer2 = 178 ' OVF every 10mS
Incr Tim2var
If Tim2var >= 400 Then
Tim2var = 0
Ok_to_read_vbat = 1
End If
Return
Sub Read_vbat
Ok_to_read_vbat = 0
Adcval = Getadc(5)
Vbat = Adcval * 4.92
' Vbat is measured through a voltage divider (R1=R2)
Vbat = Vbat * 2.01 ' R2's measured resistance is slightly smaller
' show in Volts
Vbat = Vbat / 1000
Vbat_str = Fusing(vbat , "#.&&")
'Print : Print "Battery Voltage= " ; Vbat_str ; " [V]"
Select Case Vbat
Case Is > 8.3 : Showpic 72 , 1 , Battery100
Case 7.8 To 8.3 : Showpic 72 , 1 , Battery75
Case 7.2 To 7.8 : Showpic 72 , 1 , Battery50
Case Is < 7.2 :
Toggle Lbat_pic
If Lbat_pic = 0 Then
Showpic 72 , 1 , Batterylow2
Else
Showpic 72 , 1 , Batterylow1
Print "Battery low !"
End If
End Select
End Sub
Sub Calibration
Ok_to_read_vbat = 0
Cls
Print "Calibration"
Print "make sure to remove any L or C from the Measuring Terminals"
Print
Print "please wait ..."
Lcdat 2 , 1 , "Calibration" ;
Lcdat 3 , 1 , "please wait .." ;
Waitms 400
Lcdat 5 , 1 , "Æ"
Print "^"
Reset Red_led
Reset Blue_led
' prepare to measure the Frequency without Calibration Capacity
Set Calibrate ' disconnect Ccal
Lcdat 5 , 1 , "Æ"
Print "^"
I = 0
J = 0
K = 0
For I = 1 To 6
'Print I
Incr J
Waitms 500
X = I * 6
X = X + 1
Lcdat 5 , X , "Æ"
Print "^"
If J = 2 Then
Incr K
J = 0
Print "F1= " ; Pulses ; " [Hz] (base frequency)"
If K = 3 Then
F1 = Pulses
Print "F1= " ; F1 ; " [Hz] (base frequency)"
' now prepare to measure the Frequency with added Calibration Capacitance
Reset Calibrate ' connect Ccal
End If
End If
Next
Lcdat 5 , 43 , "Æ"
Print "^"
Waitms 500
Lcdat 5 , 49 , "Æ"
Print "^"
J = 0
K = 0
For I = 9 To 14
'Print I
Incr J
Waitms 500
X = I * 6
X = X + 1
Lcdat 5 , X , "Æ"
Print "^"
If J = 2 Then
Incr K
J = 0
Print "F2= " ; Pulses ; " [Hz] (calibration frequency)"
If K = 3 Then
K = 0
F2 = Pulses
Print "F2= " ; F2 ; " [Hz] (calibration frequency)"
End If
End If
Next
Cls
Lcdat 2 , 1 , "Calibration"
Lcdat 3 , 1 , "complete !"
Print "Calibration complete !"
Waitms 2000
Cls
Lcdat 5 , 1 , "L-Mode C-Mode"
Print "C Done !"
Print
Print
End Sub
Sub Measure_c
Ok_to_read_vbat = 1
Cls
Lcdat 1 , 1 , "Capacitance"
Showpic 14 , 10 , Capacitor
Waitms 2000
Set Blue_led
Set Measure_mode ' select Capacitance Mode
Set Calibrate ' disconnect Ccal
For I = 1 To 4
Waitms 250
Next
I = 0
Do
F3 = Pulses
Print "F3= " ; F3 ; " [Hz] (frequency for C_det)"
Dvar1 = F1 / F3
Dvar1 = Dvar1 * Dvar1
Dvar1 = Dvar1 - 1
Dvar2 = F1 / F2
Dvar2 = Dvar2 * Dvar2
Dvar2 = Dvar2 - 1
Dvar1 = Dvar1 / Dvar2
C_measured = Dvar1
C_measured = C_measured * Ccal
Call Convert(c_measured)
If New_str_value <> "Error !" Then
New_str_value = "C= " + New_str_value
New_str_value = New_str_value + "F]"
End If
Print New_str_value
Lcdat 4 , 1 , " "
Lcdat 4 , 1 , New_str_value
Incr I
Waitms 1000
Loop Until I > 4
Reset Blue_led
Lcdat 5 , 1 , "L-Mode C-Mode"
Print "CM Done !"
End Sub
Sub Measure_l
Ok_to_read_vbat = 1
Cls
Lcdat 1 , 1 , "Inductance "
Showpic 14 , 12 , Inductor
Waitms 2000
Set Red_led
Reset Measure_mode ' select Inductance Mode
Set Calibrate ' disconnect Ccal
For I = 1 To 4
Waitms 250
Next
I = 0
Do
F4 = Pulses
Print "F4= " ; F4 ; " [Hz] (frequency for L_det)"
Dvar1 = F1 / F4
Dvar1 = Dvar1 * Dvar1
Dvar1 = Dvar1 - 1
Dvar2 = F1 / F2
Dvar2 = Dvar2 * Dvar2
Dvar2 = Dvar2 - 1
Dvar1 = Dvar1 * Dvar2
Svar1 = F1
Svar1 = 2pi * Svar1
Svar1 = 1 / Svar1
Svar1 = Svar1 ^ 2
L_measured = Dvar1
L_measured = L_measured / Ccal
L_measured = L_measured * Svar1
Call Convert(l_measured)
If New_str_value <> "Error !" Then
New_str_value = "L= " + New_str_value
New_str_value = New_str_value + "H]"
End If
Print New_str_value
Lcdat 4 , 1 , " "
Lcdat 4 , 1 , New_str_value
Incr I
Waitms 1000
Loop Until I > 4
Reset Red_led
Lcdat 5 , 1 , "L-Mode C-Mode"
Print "LM Done !"
End Sub
Sub Convert(value As Single)
New_str_value = ""
If Value > 0 Then
If Value < Nano Then
Scaled_val = Value * 1000000000000
New_str_value = Fusing(scaled_val , "#.&&")
New_str_value = New_str_value + " [p"
Else
If Value < Micro Then
Scaled_val = Value * 1000000000
New_str_value = Fusing(scaled_val , "#.&&")
New_str_value = New_str_value + " [n"
Else
If Value < Milli Then
Scaled_val = Value * 1000000
New_str_value = Fusing(scaled_val , "#.&&")
New_str_value = New_str_value + " [u"
Else
If Value < 1 Then
New_str_value = Fusing(scaled_val , "#.&&&")
New_str_value = New_str_value + " [m"
Else
If Value < 10 Then
New_str_value = Fusing(scaled_val , "#.&")
New_str_value = New_str_value + " ["
Else
New_str_value = "Error !"
End If
End If
End If
End If
End If
Else
New_str_value = "Error !"
End If
End Sub
' "glcd-Nokia3310.lib" must be copied in the bascom library folder.
' Don't forget to set the fusebits of the microcontroller.
' Fusebits : FF
' Fusebits High : D9
' Fusebits Extended : FFhoi dekees, ik probeer het te uploaden via de aruino uno als isp programmer (met isp shield)
Daar zitten 3 leds op heartbeat-error-program.
Na het uploaden van de file blijft het rode error lampje branden, echter met bascom avr zie ik geen foutmelding, ik heb al van alles geprobeerd maar het wil niet lukken, of ik gebruik de verkeerde programmer omdat ik ook niet in staat ben om de fusebits aan te passen, onder dos promt kan ik enkel Lfuse en Hfuse aanpassen, Efuse dan krijg ik vanuit dos wel een foutmelding
Ik heb geen verstand van bascom, en ook die Isp shield is nieuw voor mij. Ik zie op internet een ISP shield van Evil Mad scientist. Gebruik je die? Die ziet er wel goed uit.
Die moet op een Arduino geprikt worden.
Vervolgens moet je mbv de Arduino IDE de juiste software in de arduino laden om die als ISP programmer te gebruiken.
En tot slot gebruik je avrdude om je Bascom hexfile en de fuses naar je target AtMega328 te laden.
Dus er zijn nogal wat stappen nodig en die kunnen allemaal fout gaan.
Daar heb ik ook dagen mee zitten kl*ten. Toen maar een USBASP aangeschaft. Die kosten weinig, en werken voortreffelijk.
Bijvoorbeeld hier:
https://www.vanallesenmeer.nl/USBasp-USB-programmer-voor-Atmel-AVR-
Of bij ome Ali natuurlijk.
Programmeren met AVRdude:
Alleen programma: "avrdude -p t85 -c usbasp -U flash:w:programmanaam.hex" (hier is t85 een ATTINY85)
Inclusief fuses: "avrdude -B 80kHz -p t85 -c usbasp -U lfuse:w:0xE2:m -U hfuse:w:0xDF:m -U efuse:w:0xFF:m -U lock:w:0xFF:m -U flash:w:programmanaam.hex"
Doe je zelf dit plezier.... Het wordt een stuk minder stressig.
[Bericht gewijzigd door fripster op (18%)]
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
Vraag is ook of je door wilt met Bascom of dat het eenmalig is.
Een Arduino voor een LCR meter project kun je zo aan de PC hangen via USB en programmeren.
@Roland.
Het is eenmalig, in de regel gebruik ik voornamelijk gewoon de arduino maar de ontwerper van de lc meter heeft het prg dus in bascom geschreven, ik heb vrijwel geen kennis van programmeren (soms lukt het wel) maar het gedeelte van de fusebits snap ik ook niet helemaal, in de read me stond dat je de fuse's dus op een bepaalde waarde moest zetten, de vraag is dus hoe stel je die fuse in ? en is het wel mogelijk om bascom via een arduino te programmeren isn de atmega328.
Het gaat iig over deze meter https://www.youtube.com/watch?v=KhJiE4gL5T4
https://github.com/coreWeaver/LC-Meter
[Bericht gewijzigd door zyapancho op (11%)]
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
Beetje zonde om dan allerlei hardware aan te gaan schaffen, ik zou een oproepje in "Vraag en Aanbod" zetten of iemand een m328 voor je wil programmeren.
Er staat een .hex bestand op Github, dus Bascom heb je niet nodig.
https://github.com/coreWeaver/LC-Meter/tree/main/LC%20Meter%20v1.0/2a.…
@roland
Het mooie is dat ik dat hex bestand heb, bascom avr compiled het wel ik krijg het alleen niet in de chip?
benleentje
Golden Member
OK de hex file heb je al.
Om een arduino uno of andere arduino als ISP programmer te kunnen gebruiken moet je eerst in de arduino software gaan naar bestand/ voorbeelden/ ingebouwde voorbeelden/ 11 ArduinoIsp naar de arduino uploaden. Deze software maakt dan van een arduino een programmer
Dan de bedrading van de arduino naar atmega328/p goed in orde maken en daarna kan je het Hex bestand naar de programmer uploaden die het dan weer naar de atmega328/p upload.
Zelf nooit gedaan maar zo zou het volgens mij moeten werken.
Op donderdag 5 december 2024 17:24:39 schreef benleentje:
OK de hex file heb je al.Om een arduino uno of andere arduino als ISP programmer te kunnen gebruiken moet je eerst in de arduino software gaan naar bestand/ voorbeelden/ ingebouwde voorbeelden/ 11 ArduinoIsp naar de arduino uploaden. Deze software maakt dan van een arduino een programmer
Dan de bedrading van de arduino naar atmega328/p goed in orde maken en daarna kan je het Hex bestand naar de programmer uploaden die het dan weer naar de atmega328/p upload.
Zelf nooit gedaan maar zo zou het volgens mij moeten werken.
Bij Bascom kun je bij opties\programmer ook Arduino kiezen (naast USBasp o.a.). Ik meen me te herinneren dat Bascom dan gebruik maakt van de Arduino bootloader. Google op : Bascom Arduino programmer