Skompilowało się bez błędów. Bascom 1.11.9.8
' Laminarka do PCB
' Aberdeen 2014
' By Chodi
' kwarc wewnetrzny 8MHz
' fusy L=0xD4 H=0xD9
$regfile = " m8def.dat "
$crystal = 8000000
'LCD
Config Lcd = 16 * 2
Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.1 , Db4 = Portd.3 , Db5 = Portd.4 , Db6 = Portb.6 , Db7 = Portb.7
'ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc
'PWM
Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Down
'timer sterowania fazowego
Config Timer0 = Timer , Prescale = 1024
On Timer0 Triakon
'detekcja zera sieci
Config Int0 = Falling
On Int0 Przejscie
'znak stopnia
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32 ' znak stopnia
' konfiguracja wejsc/wyjsc
' przyciski
Config Pind.6 = Input
Sw1 Alias Pind.6
Config Pind.7 = Input
Sw2 Alias Pind.7
Config Pinb.0 = Input
Sw3 Alias Pinb.0
'czujniki optyczne
Config Pinb.2 = Input
Opto1 Alias Pinb.2
Config Pinc.0 = Input
Opto2 Alias Pinc.0
'pikawka
Config Portc.4 = Output
Buzer Alias Portc.4
'wyjscie grzalki
Config Portc.5 = Output
Triak Alias Portc.5
'detekcja zera jako wejscie
Config Pind.2 = Input
Set Portd.2
'sterowanie silnikiem DC
Config Portc.2 = Output
Kier1 Alias Portc.2
Config Portc.3 = Output
Kier2 Alias Portc.3
Config Portb.1 = Output 'pwm1a
Silnik Alias Portb.1
'zmienne
Dim Moc As Byte
Dim Zwloka As Byte
Dim Termistor As Integer
Dim Temperatura As Integer
Dim Roznica As Integer
Dim Temp As Integer
Dim Temp_obl As Integer
Dim Pikniecia As Byte
Dim Cykle As Byte
Dim Kierunek As Bit
Dim Rundy As Byte
Dim Krok As Byte
Dim Wynik As Byte
'podprogramy
Declare Sub Ustawienia
Declare Sub Rozruch
Declare Sub Koniec_pracy
'Dane startowe
Temperatura = 190
Cykle = 30
Rundy = 0
' powitanie
Cls
Upperline
Lcd " Laminarka do PCB "
Lowerline
Lcd " By Bodzio 2015 "
Wait 2
'wywolanie podprogramu ustawien
Call Ustawienia
Cls
Upperline
Lcd " Temp. : " ; Temperatura ; Chr(0) ; " C "
Lowerline
Lcd " Liczba cykli: " ; Cykle
Wait 2
'rozgrzanie walkow
Call Rozruch
'program glowny
Pwm1a = 255
Cls
Enable Interrupts
Enable Int0
Enable Timer0
Stop Timer0
Do
'sterowanie temperatura
Termistor = Getadc(1)
Temp = 1024 - Termistor
Temp = Temp / 3
Temp_obl = Temp + 1000
Roznica = Temp_obl - Temperatura
Select Case Roznica
Case 1030 To 2000:
Disable Interrupts
Stop Timer0
Triak = 0
Upperline
Lcd " AWARIA !!!!!!!! "
Lowerline
Lcd " odlacz zasilanie "
Buzer = 1
Case 1025 To 1029:
Zwloka = 68
Case 1020 To 1024:
Zwloka = 64
Case 1015 To 1019:
Zwloka = 61
Case 1010 To 1014:
Zwloka = 58
Case 1005 To 1009:
Zwloka = 46
Case 1000 To 1004:
Zwloka = 40
Case 995 To 999:
Zwloka = 38
Case 990 To 994:
Zwloka = 33
Case 985 To 989:
Zwloka = 30
Case 980 To 984:
Zwloka = 29
Case 975 To 979:
Zwloka = 28
Case 970 To 974:
Zwloka = 27
Case 965 To 969:
Zwloka = 26
Case 960 To 964:
Zwloka = 24
Case 955 To 959:
Zwloka = 21
Case 950 To 954:
Zwloka = 20
Case 945 To 949:
Zwloka = 13
Case 940 To 944:
Zwloka = 10
Case 0 To 754:
Zwloka = 2
End Select
'sterowanie silnikiem
If Opto2 = 0 And Opto1 = 1 And Krok = 0 Then
Krok = 1
End If
If Opto2 = 0 And Opto1 = 0 And Krok = 1 Then
Krok = 2
End If
If Opto2 = 1 And Opto1 = 0 And Krok = 2 Then
Wait 1
Kierunek = 0
Krok = 3
End If
If Opto2 = 0 And Opto1 = 0 And Krok = 3 Then
Krok = 4
End If
If Opto2 = 0 And Opto1 = 1 And Krok = 4 Then
Wait 1
Kierunek = 1
Krok = 1
Incr Rundy
End If
If Rundy = Cykle Then
Krok = 5
Kierunek = 0
Rundy = 0
For Pikniecia = 1 To 100
Buzer = 1
Waitms 50
Buzer = 0
Waitms 50
Next Piknieca
Call Koniec_pracy
End If
If Opto1 = 1 And Opto2 = 1 Then
Krok = 0
Kierunek = 1
End If
If Kierunek = 0 Then
Kier1 = 0 : Kier2 = 1
End If
If Kierunek = 1 Then
Kier1 = 1 : Kier2 = 0
End If
'wyswietlane dane
Wynik = Cykle - Rundy
Upperline
Lcd " Temperat. : " ; Temp ; Chr(0) ; " C "
Lowerline
Lcd " Nadal " ; Wynik ; " przejsc "
Loop
End
' podprogram ustawienia wartosci
Sub Ustawienia
Triak = 0
Cls
Cursor Off
Do
Upperline
Lcd " Wprowadz temper. "
Locate 2 , 7
Lcd Temperatura ; Chr(0) ; " C "
If Sw1 = 0 Then Temperatura = Temperatura + 5
If Sw3 = 0 Then Temperatura = Temperatura - 5
If Temperatura & gt; 250 Then Temperatura = 250
If Temperatura & lt; 50 Then Temperatura = 50
Waitms 100 'zwiekszenie szans trafienia w wynik ;)
Loop Until Sw2 = 0
Waitms 750
Cls
Do
Upperline
Lcd " Liczba przejsc "
Locate 2 , 7
Lcd Cykle
If Sw1 = 0 Then Incr Cykle
If Sw3 = 0 Then Decr Cykle
If Cykle & gt; 50 Then Cykle = 50
If Cykle & lt; 1 Then Cykle = 1
Waitms 100 ' jak wyzej :-)
Loop Until Sw2 = 0
End Sub Ustawienia
'podprogram rozgrzania i startu
Sub Rozruch
Cls
Upperline
Lcd " Rozgrzanie rolek "
Buzer = 1
Waitms 500
Buzer = 0
Kier1 = 0
Kier2 = 1
Pwm1a = 200
Do
Termistor = Getadc(1)
Temp = 1024 - Termistor
Temp = Temp / 3
Triak = 1
Lowerline
Lcd " Czekaj... " ; Temp ; Chr(0) ; " C "
Loop Until Temp & gt; Temperatura
For Pikniecia = 1 To 3
Buzer = 1
Waitms 250
Buzer = 0
Waitms 250
Next Pikniecia
Triak = 0
End Sub Rozruch
' koniec
Sub Koniec_pracy
Cls
Disable Interrupts
Stop Timer0
Triak = 0
Do
Upperline
Lcd " Koniec pracy ? "
Lowerline
Lcd " G(T) D(N) "
If Sw1 = 0 Then
Kier1 = 1
Kier2 = 0
Pwm1a = 255
Cls
Do
Termistor = Getadc(1)
Temp = 1024 - Termistor
Temp = Temp / 3
Upperline
Lcd " Chlodze rolki... "
Lowerline
Lcd " Czekaj.......... "
Loop Until Temp & lt; 50
For Pikniecia = 1 To 10
Buzer = 1
Waitms 100
Buzer = 0
Waitms 100
Next X
Do
Upperline
Lcd " Mozna odlaczyc "
Lowerline
Lcd " Do nastepnego :) "
Triak = 0
Pwm1a = 0
Loop
End If
If Sw3 = 0 Then
Config Watchdog = 16
Do
Start Watchdog
Loop
End If
Loop
End Sub Koniec_pracy
'detekcja zera sieci na przerwaniu
Przejscie:
Triak = 0
Load Timer0 , Zwloka
Start Timer0
Return
'przerwanie od timer0
Triakon:
Triak = 1
Stop Timer0
Waitus 10 ' niby tego byc nie powinno .... '
Triak = 0 'ale bez tego nie zatyka triaka i dupa blada :/
Return