Étape 9: Code
Lorsque vous programmez votre Atmega, vous devez également désactiver JTAG dans le fusebits et la valeur de l’oscillateur interne à 8MHz.
Le code s’insérera dans un Atmega16, mais j’ai utilisé un Atmega32 que je tiens à ajouter quelques fonctionnalités supplémentaires plus tard.
$regfile = « m32def.dat »
$crystal = 8000000
$baud = 9600
Config Serialin = mise en mémoire tampon, taille = 255
Config Serialout = mise en mémoire tampon, taille = 100
Config Graphlcd = 240 * 128, Dataport = Porta, Controlport = Portc, Ce = 5, Cd = 4, Wr = 7, Rd = 6, réinitialiser = 2, Fs = 3, Mode = 8
config Scl = Portc.0
Config Sda = Portc.1
Pind.3 Alias Cha
CHB Alias Pind.4
Config Cha = entrée
config Chb = entrée
Const Ds1307w = & HD0 ' écrire DS1307
Const Ds1307r = & HD1 ' lu ds1307
Const Adsecs = & H00 ' adresse secondes
Admins const = & H01 ' adresse minutes
Dim Count As Byte
Dim I As Byte
Dim J As Byte
Dim Pos As Byte
Dim Oldpos As Byte
Dim Maxpos As Byte
Dim État As Byte
Dim Volume As Byte
Dim Temp As Byte
Dim Uart_in As Byte
Dim Uart_buffer As Byte
Dim heures As Byte
Dim minutes As Byte
Dim s As Byte
Dim longueur As Byte
Dim Boxx As Byte
Dim Boxx2 As Byte
Dim Tube(4) As Byte
Dim X As Byte
Dim Uart_in_str As String * 255
Dim Stationname As String * 60
Dim Title As String * 60
Dim Station_pos As Byte
Dim Title_pos As Byte
Dim pointeur As Byte
Dim Station_length As Byte
Dim Title_length As Byte
Dim Temp_str As String * 4
Dim Volumestr As String * 3
Dim Station(20) As String * 30
Sur Int0 0int
Activez Int0
Activer les interruptions
' Set Chb
Sur 1int Int1,
Activez Int1
Activer les interruptions
Attendre 1
CLS
Init :
ShowPic 0, 0, Intro
Boîte (115, 90)-(200, 104), 255
Pour I = 118 à 194, étape 4
J = I + 3
Boxfill (i, 92) - j, 102, 255
Attendre 3
Prochaine
Imprimer des Chr (13)
Attendre 2
Imprimer « mpc clair »
For I = 0 à 3
Stationname = Lookupstr (i, Tunerlist2)
Imprimer « mpc ajouter » ; Stationname
Prochaine
Print "mpc volume 50"
Imprimer « mpc play »
Volume = 20
GoSub Empty_buffer
J’ai = 1
Count = 1
Principal :
État = I
CLS
Si l’État = 1 Then Goto Radio
Si l’état = 2 Then Goto Tuning
Si l’État = 3 Then Goto Vol
Si l’État = 4 Then Goto Setup
Radio :
Maxpos = 6
POS = 1
Oldpos = 1
Boxx = 0
Boxx2 = 40
ShowPic 0, 88, jouer
ShowPic 40, 88, Pause
ShowPic 80, 88, Stopp
ShowPic 120, 88, Volume
ShowPic 160, 88, Tuner
ShowPic 200, 88, horloge
Boîte (0, 88) - 40 (127) 255
Faire
Si j’ai <> d’état puis Goto Main
Si Pos <> Oldpos puis
Boîte (boxx, 88)-(boxx2, 127), 0
Boxx = Pos - 1
Boxx = Boxx * 40
Boxx2 = Boxx + 40
Boîte (boxx, 88)-(boxx2, 127), 255
Oldpos = Pos
End If
Imprimer « echo » ; Chr (34) ; « currentsong » ; Chr (34) ; " | NC localhost 6600 | grep -e "; Chr (34) ; « ^ Titre: "; Chr (34) ; " -e " ; Chr (34) ; « ^ Nom: "; Chr (34) ; ">/dev/tts/0" ; Chr (13)
Waitms 500
GoSub Getuart
GoSub Parser
Texte de CLS
Recherchez 5, 1
LCD Stationname
Localiser 8, 1
Titre de l’écran LCD
GoSub Readclock
Boucle
Tuning :
CLS
Count = 1
Faire
Texte de CLS
Si j’ai <> d’état puis Goto Main
GoSub Readclock
Pour J = 1 à 4
Station(j) = Lookupstr (j, Tunerlist)
Prochaine
J = Count
Localiser les 5, 5
LCD Station(j)
J = Count + 1
Repérez les 6, 5
LCD Station(j)
J = Count + 2
Localiser les 7, 5
LCD Station(j)
Waitms 500
Boucle
Vol :
CLS
Faire
GoSub Readclock
Si j’ai <> d’état puis Goto Main
Imprimer « echo » ; Chr (34) ; « statut » ; Chr (34) ; " | NC localhost 6600 | grep -e "; Chr (34) ; « ^ volume: "; Chr (34) ; ">/dev/tts/0" ; Chr (13)
Waitms 100
GoSub Getuart
GoSub Volumeparser
Texte de CLS
Repérez les 6, 10
Volume = Val(volumestr)
Écran LCD "Volume:" ; Volume
Boucle
Programme d’installation :
J = 1
Si J = 1 puis Count = nombre d’autre heures = min
CLS
Faire
CLS
Si j’ai <> d’état puis Goto Main
« Gosub Readclock
Si J = 1, puis heures = nombre d’autre Mins = Count
Tube(2) = mn / 10 ' fractionne les heures et minutes en
Temp = Tube(2) * 10 4 chiffres alors qu’il peut être affiché
Tube(1) = minutes - Temp
Tube(4) = heures / 10
Temp = Tube(4) * 10
Tube(3) = heu - Temp
Temp = Tube(4)
X = 48
GoSub Clockpic
Temp = Tube(3)
X = 72
GoSub Clockpic
Temp = 11
X = 96
GoSub Clockpic
Temp = Tube(2)
X = 120
GoSub Clockpic
Temp = Tube(1)
X = 144
GoSub Clockpic
Localiser 8, 8
Écran LCD j’ai
Waitms 100
Boucle
Fin
0int :
Si j’ai = 1 Pos et = 1 puis Print « mpc play »
Si j’ai = 1 Pos et = 2 puis Print « mpc pause »
Si j’ai = 1 Pos et = 3 puis imprimé « mpc stop »
Si j’ai = 1 et Pos = 4 puis j’ai = 3
Si j’ai = 1 et Pos = 6 alors j’ai = 4
Si l’état = 2 Then
Imprimer « mpc play » ; Comte
J’ai = 1
End If
Si j’ai = 1 et Pos = 5 alors je = 2
Waitms 100
Si l’État = 3 alors j’ai = 1
Si j’ai = 4 et J = 2 Then
GoSub Setclock
J’ai = 1
End If
Si j’ai = 4 et J = 1 Then
GoSub Setclock
J = 2
End If
Retour
1int :
Waitms 1
Si Cha = 1 et j’ai <> 3 puis
Si Chb = 0 alors Incr comptent d’autre Decr comte
End If
Si Cha = 1 et I = 3 Then
Si Chb = 0 puis Print "mpc volume + 5" Else Print "mpc volume -5"
End If
POS = Count
Si Pos > Maxpos Then Pos = Maxpos
Si Pos < 1 puis Pos = 1
Retour
Getuart :
Uart_in_str = ""
Faire
Uart_buffer = Ischarwaiting()
Si Uart_buffer > 0 Then
Uart_in = Inkey()
Si Len(uart_in_str) < 254 puis Uart_in_str = Uart_in_str + Chr(uart_in)
Si Len(uart_in_str) = 254 Then Uart_in_str = Uart_in_str + Chr (13)
End If
Boucle jusqu'à Uart_buffer = 0
GoSub Empty_buffer
Retour
Volumeparser :
Volumestr = ""
Temp = Instr (uart_in_str, « volume: ")
Temp = Temp + 8
Volumestr = Mid (uart_in_str, Temp, 3)
Retour
Analyseur :
Stationname = ""
Titre = ""
Station_pos = Instr (uart_in_str, "nom:")
Title_pos = Instr (uart_in_str, « titre: »)
Station_pos = Station_pos + 6
Longueur = 0
Faire
Longueur de la incr
Pointeur = Station_pos + longueur
Temp_str = Mid (uart_in_str, pointeur, 1)
Boucle jusqu'à Temp_str = Chr (13) ou Temp_str = ""
Si longueur > 60 puis longueur = 60
Stationname = Mid (uart_in_str, Station_pos, longueur)
Title_pos = Title_pos + 7
Longueur = 0
Faire
Longueur de la incr
Pointeur = Title_pos + longueur
Temp_str = Mid (uart_in_str, pointeur, 1)
Boucle jusqu'à Temp_str = Chr (13) ou Temp_str = ""
Si longueur > 60 puis longueur = 60
Titre = Mid (uart_in_str, Title_pos, longueur)
Si Station_pos = 6 Then Stationname = « Nom introuvable! »
Si Title_pos = 7 puis titre = « Titre introuvable! »
Retour
Empty_buffer :
Faire
Uart_in = Inkey()
Uart_buffer = Ischarwaiting()
Boucle jusqu'à Uart_buffer = 0
Retour
Readclock :
I2cstart
I2cwbyte Ds1307w
I2cwbyte Admins
I2cstop
I2cstart
I2cwbyte Ds1307r
I2crbyte mn, Ack
I2crbyte heures, Nack
Heures = heures et & B00111111 ' supprime bit6 & bit7
Heures = Makedec(hours) ' convertit BCD décimal
Min = Makedec(mins)
Tube(2) = mn / 10 ' fractionne les heures et minutes en
Temp = Tube(2) * 10 4 chiffres alors qu’il peut être affiché
Tube(1) = minutes - Temp
Tube(4) = heures / 10
Temp = Tube(4) * 10
Tube(3) = heu - Temp
Temp = Tube(4)
X = 48
GoSub Clockpic
Temp = Tube(3)
X = 72
GoSub Clockpic
Temp = 11
X = 96
GoSub Clockpic
Temp = Tube(2)
X = 120
GoSub Clockpic
Temp = Tube(1)
X = 144
GoSub Clockpic
Retour
SetClock :
Min = Makebcd(mins)
Heures = Makebcd(hours)
Remise à zéro Hours.6
I2cstart
I2cwbyte Ds1307w
I2cwbyte Adsecs
I2cwbyte & B00000000
I2cwbyte mn
I2cwbyte heures
I2cstop
Heures = heures et & B00111111 ' supprime bit6 & bit7
Heures = Makedec(hours) ' convertit BCD décimal
Min = Makedec(mins)
Retour
Clockpic :
Si Temp = 1 X Showpic, 0, 1
Si Temp = 2 X Showpic, 0, 2
Si Temp = 3 X Showpic, 0, 3
Si Temp = 4 X Showpic, 0, 4
Si Temp = 5 X Showpic, 0, 5
Si Temp = 6 X Showpic, 0, 6
Si Temp = 7 X Showpic, 0, 7
Si Temp = 8 X Showpic, 0, 8
Si Temp = 9 X Showpic, 0, 9
Si Temp = 0 X Showpic, 0, 0
Si Temp = 11 X Showpic, 0, Dp
Retour
Intro :
$bgf « wifiradio.bgf »
Jouer :
$bgf « play.bgf »
Pause :
$bgf « pause.bgf »
Stop :
$bgf « stop.bgf »
Volume :
$bgf « volume.bgf »
Tuner :
$bgf « tuner.bgf »
Horloge :
$bgf « clock.bgf »
0 :
$bgf « 0.bgf »
1 :
$bgf « 1.bgf »
2 :
$bgf « 2.bgf »
3 :
$bgf « 3.bgf »
4 :
$bgf « 4.bgf »
5 :
$bgf « 5.bgf »
6 :
$bgf « 6.bgf »
7 :
$bgf « 7.bgf »
8 :
$bgf « 8.bgf »
9 :
$bgf « 9.bgf »
DP :
$bgf « dp.bgf »
Streep :
$bgf « streep.bgf »
Tunerlist :
Données "", « réseau de 1920 », « KCEA », « Tango FM Junin Argentine », « TANGOCLUB »
Tunerlist2 :
Données "http://64.5.130.43:80", "http://198.182.76.2:8000", "http://200.58.116.222:10580", http://190.245.64.194:8000