Forum: Mikrocontroller und Digitale Elektronik Code from 328pdef to Attiny45


von Tomaz S. (tomash)


Lesenswert?

Can Somebody help me to change the code written for chip Atmel 328pdef 
in BASCOM to code for chip attiny45?

Kann jemand helfen Mihr die kode fur Atmel 328pdef in die kode fur 
attiny45 zu vervexeln?

Kindest Regards/Schoene Gruesse und Danke Schoen!



'----------------------------------------------------------------------- 
---
'name                     : adc.bas
'copyright                : (c) 1995-2009, MCS Electronics
'purpose                  : demonstrates AD converter
'micro                    : Mega48
'suited for demo          : yes
'commercial addon needed  : no
'----------------------------------------------------------------------- 
---

$baud = 19200



'configure single mode and auto prescaler setting
'The single mode must be used with the GETADC() function

'The prescaler divides the internal clock by 2,4,8,16,32,64 or 128
'Because the ADC needs a clock from 50-200 KHz
'The AUTO feature, will select the highest clockrate possible
Config Adc = Single , Prescaler = Auto , Reference = Avcc
'Now give power to the chip
Start Adc

'With STOP ADC, you can remove the power from the chip
'Stop Adc

Dim W As Word , Channel As Byte

Config Portb.5 = Output

Dim X As Integer
Dim Y As Integer
Dim Z As Integer
Dim T As Integer

X = 0
Y = 0
Z = 0

'now read A/D value from channel 0
Do

Z = 0

  W = Getadc(channel)
Print W
  Incr Channel
  If Channel > 0 Then Channel = 0
  Waitms 100


If W > 300 And W < 330 Then
Y = 1

Else

Y = Z
Print Y
End If
If Y = 0 Then
Incr T

Else
T = Z
Print T
End If


If T > 100 Then

X = 1



Portb.5 = 1

Else

Portb.5 = 0

X = Z
End If



Print X
Print Y
Print Z
Print T

Loop
End

von HildeK (Gast)


Lesenswert?

I have no knowledge in BASCOM, but some things I can say:
- ATTiny45 has a Portb.5, but this is normally used as Reset pin. Change 
it to one of the others (0 to 4), except of ADC channel 0. Otherwise you 
can only do High Voltage Programming in the future.
- do not use ADC channel 0 because of the same reason: it is located on 
the reset pin. Use channel 1, 2 or 3.
- Why do you increment the variable 'channel' if you only will use 
channel 0?
1
  W = Getadc(channel)
2
Print W
3
  Incr Channel
4
^^^^^^^^
5
  If Channel > 0 Then Channel = 0
6
  Waitms 100
- There is no information about the clock frequency.
- I can not see where the prescaler is set.

von Axel R. (Gast)


Lesenswert?

1
Dim W As Word , Channel As Byte
2
3
Config Portb.5 = Output
4
5
Dim X As Integer
6
Dim Y As Integer
7
Dim Z As Integer
8
Dim T As Integer
9
10
X = 0
11
Y = 0
12
Z = 0
13
14
'now read A/D value from channel 0
15
Do
16
17
  Z = 0
18
19
  W = Getadc(0)
20
  Print W
21
  Waitms 100
22
  
23
  If W > 300 And W < 330 Then
24
    Y = 1
25
  Else
26
    Y = Z
27
    Print Y
28
  End If
29
30
  If Y = 0 Then
31
    Incr T
32
  Else
33
    T = Z
34
    Print T
35
  End If
36
37
  If T > 100 Then
38
    X = 1
39
    Portb.5 = 1
40
  Else
41
    Portb.5 = 0
42
    X = Z
43
  End If
44
45
  Print X
46
  Print Y
47
  Print Z
48
  Print T
49
50
Loop

for better usability, so we can imagine what the intention of the 
Programflow is.
So you use only Cannel zero, i 've banned the coresponding Lines from 
the code.

>(  Incr Channel
>  If Channel > 0 Then Channel = 0 )

You will have to manage the OutputPort B.5, bcs. not exist in ATTINY45, 
also no USART like in 328p.
You can arrange and setup a softuart in BASCOM with
"Open "comb.1:9600,8,n,1" For Output As #1", after Setup these with:
"Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , 
Databits = 8 , Clockpol = 0"
regard on your requirements (wich Portpin for Transmitting?)

Better follow this link:http://avrhelp.mcselec.com/index.html?uart.htm
scroll down to "SOFTWARE UART"


StromTuner

von Axel R. (Gast)


Lesenswert?

thanks about the hints about the reset-pin. Its important!
Use some other PIN for daily work on TIny45.

BTW:
What you want to do?



StromTuner

von Tomaz S. (tomash)


Lesenswert?

Thank you AXEL and HILDEK for quick reply and I hope I can post 
sometimes some sollutions back for you!

Jp, I know the ports must be changed but i don't know what else inside 
code because don't have experince with attiny45.

However the Attiny input port for ADC wattersensor should be pin 
7(PB2-channel 1)

And output Led diode PIN 6 ..I hope it's possible.

von Günter M. (redround)


Lesenswert?

I don't know BASCOM neither ... but in nativ C it would be possible.

Another point: PRINT sounds like a serial output. This will also not 
work on the ATtiny I guess.

at least Z and Channel seems to be obsolete. Z is always 0 as far as I 
can see and Channel never used.

: Bearbeitet durch User
von Tomaz S. (tomash)


Lesenswert?

Danke Günter fur dein antwort aber "Print" ist nur fur die simulation 
notig das ich die vershiedene detaile in den program sehen kann.

Schoene Gruesse Tomaz

von Günter M. (redround)


Lesenswert?

macht den ganzen Code nur unnötig unübersichtlich. Trotzdem würde mich 
mal interessieren, was genau Du zu erreichen versuchst. Ich bin mir 
nämlich nicht sicher, ob der Code wirklich sinnvoll ist.

Momentan würde ich sagen, die LED geht an, wenn bei 100 Messungen in 
Folge der Wandler-Wert NICHT zwischen 300 und 330 liegt. Das könnte man 
aber auch kürzer schreiben ;-) Wenn aber auch nur ein einziger Ausreißer 
dabei ist, bleibt die LED dunkel. Ist das wirklich so gewollt? Meist 
macht man einfach eine Mehrzahl von Messungen und bildet den Mittelwert 
daraus. Wenn der dann über/unter den Schwellwerten liegt, erfoglt eine 
Aktion. So fallen einzelne Ausreißer (die es beim ADC immer mal geben 
kann), nicht so sehr ins Gewicht.

ach ja ... X ist wohl auch überflüssig ;-)

: Bearbeitet durch User
von posti (Gast)


Lesenswert?

Erst Mal eingerückt - Hoppla, lesbar ;)

X = 0
Y = 0
Z = 0

Do
   Z = 0
   W = Getadc(channel)

   Waitms 100

   If W > 300 And W < 330 Then
      Y = 1
   Else
      Y = Z (=0)
   End If

   If Y = 0 Then
      Incr T (kommt jetzt wo her?)
   Else
      T = Z (=0)
   End If

   If T > 100 Then
      X = 1
      Portb.5 = 1
   Else
      Portb.5 = 0
      X = Z (=0)
   End If
Loop

Etwas strukturiert

Do
   W = Getadc(channel)
   Waitms 100

   If W > 300 And W < 330 Then
      IF Z=101 then
         Portb.5 = 1
         INCR T
      Endif
      IF U<101 then
         INCR T
      ENDIF
   Else
      IF T!=0 then (oder <> ... kA, von BasCom)
         TPortb.5 = 0
      End If
      T = 0
   End If
Loop

Die doppelte IF-Abfrage sieht nicht schön aus.
Das Programm spielt nicht laufend an den Ports rum und zählt die 
Variabeln nur, wenn es sein muß - weiter wird irgendwo ein Überlauf 
statt finden, Der den Ausgang im Original, zumindest kurz, LOW werden 
lässt.

von Tomaz S. (tomash)


Lesenswert?

Ich veis mein program ist einbichen eingeruckt aber er lauft auf dem 
328pdef. Ich verde eure programe uberprufen. Danke zuerst fur eure muue!

von posti (Gast)


Lesenswert?

Hi

An 'meinem Listing' ist der Sinn des Programm nicht verändert - also 
wirst Du für den ATtiny45 die IN/OUT-Pins entsprechend ändern müssen, da 
B5, wie schon geschrieben wurde, der Reset-Pin ist.

(kann zwar auch, irgendwie, als IO benutzt werden, verliert dabei aber 
die Reset-Funktion, Die für's normale Brennen benötigt wird - also dann 
nur per HV erneut beschrieben werden kann)

von Tomaz S. (tomash)


Lesenswert?

Danke Posti! Dein program ist sehr raffiniert geschrieben!..

Alzo  ADC sensor soll pin 7(PB2-channel 1)sein?
output fur Led diode PIN 6 oder ist das portb.1?

Do
   W = Getadc(1)               (1 - ist das rihtig?)
   Waitms 100

   If W > 300 And W < 330 Then
      IF Z=101 then
         Portb.6 = 1           (portb.6 geht das? oder ist es portb.1?)
         INCR T
      Endif
      IF U<101 then
         INCR T
      ENDIF
   Else
      IF T!=0 then (oder <> ... kA, von BasCom)
         TPortb.6 = 0          (portb.6 geht das oder ist es portb.1?)
      End If
      T = 0
   End If
Loop

von Axel R. (Gast)


Lesenswert?

StromTuner


>      IF T!=0 then (oder <> ... kA, von BasCom)
>         TPortb.6 = 0       (portb.6 geht das oder ist es portb.1?)
>      End If

IF T!=0 then '(oder <> ... kA, von BasCom)
   TPortb.6 = 0  '(portb.6 geht das oder ist es portb.1?)
End If


> IF U<101 then
>          INCR T

IF T<101 then
INCR T
ENDIF

Here is the PINOUT of the Attiny45:
http://www.kentfrankovich.com/wp-content/uploads/2011/02/ATTiny45-Pinout.png
If you would like to look inside the Datasheet...
http://www.atmel.com/Images/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet.pdf

Have fun


StromTuner

von Tomaz S. (tomash)


Lesenswert?

Danke Axel R. fur deine mue!

von Tomaz S. (tomash)


Lesenswert?

Ah...ich habe ales versuht den ATTiny mit Bascom einzustellen aber es 
geht nicht.. alerdings funkzionier er auf den "tinyprogramer von 
sparkfun" an den ARDUINO 1.0.5 sehr gut.

Kann mir jemand vieleicht helfen den Code an der anfang disen post von 
Bascom zu ARDUINO 1.0.5 zu vervexeln?

Der jenige der mir hilf erwartet ihn ein sixpack bier in Slovenen von 
mir!

Danke und schone Gruesse!

von posti (Gast)


Lesenswert?

Hi

Bier ist schon ein Argument, aber Slowenien (Slovenia?) ist doch schon 
'nen Stück weit weg'.

Mit BasCom kann ich gar nicht dienen, wenn, mit etwas Assembler.

Was soll das Programm machen?
Da sich mir der darin versteckte Sinn bis dato noch nicht offenbart hat, 
wäre Deine Problemstellung interessant.

Akut liest das Programm einen ADC-Wert ein, wenn Dieser zwischen 301 und 
329 liegt, wird eine Variabel hochgezählt, sonst wird die Variabel 
wirder gelöscht.
Wenn Diese auf 100 hochgezählt ist, wird eine LED eingeschaltet.

'Riecht' nach Tasten Entprellen, dafür ist aber der ADC nicht nötig - es 
sei, Du versuchst mehrere Tasten an einer Widerstandskette einzulesen 
(R-2R).

MfG

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.