View previous topic :: View next topic |
Author |
Message |
Meister
Joined: 27 May 2010 Posts: 319
|
Posted: Mon Apr 28, 2014 9:46 am Post subject: Attiny841 strange behaviour in Bascom |
|
|
Hi,
I am now trying to get an Attiny841 application working. Because of the many Timers and Port options I hoped that might replace two other Tinys that are used presently.
Since examples are rare and rather written in C (but working) I started with programming in C and using CodevisionAVR (eval). With that I could get the timers (CTC and PWM modes) working as they should. Then I converted the Port and Register settings to Bascom directives and got that:
Code: | $regfile = "attiny841.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
'$baud = 57600
'Disable Interrupts
Puea = 0
Porta = 0
Tocpmcoe = &B0011_1110
Ddra = &B0011_1100
Tccr0a = &B0101_0010
Tccr0b = &B0000_0001
Set Tccr0b.6
Tcnt0 = 0
Ocr0a = &H03
Ocr0b = Ocr0a
Tocpmsa0 = 0
Tocpmsa1 = &B0000_1010
'Do
'Loop
'End |
That program is not doing right. The most interesting feature is that the high-frequency pulse outputs are chopped with a 29Hz frequency. Using the C-code the HF-pulses are continous.
The core of the problem seems to be related to this:
Commenting out anything but the DDRA= line there is a continous output of that 29Hz.
So just setting the DDR register causes a pulsed output of 29Hz.
Maybe somebody has a suggestion on what is going wrong.
Regards, Meister
(BASCOM-AVR version : 2.0.7.7 ) |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Mon Apr 28, 2014 10:02 am Post subject: |
|
|
this is a new supported chip. i did not even received the samples from atmel. you should do 2 things :
- check if programming works (use verify). it could be a setting for your programmer is not right.
- if it works with C, check the registers that are set. and also, try if setting DDRA in your C code gives the same problem! _________________ Mark |
|
Back to top |
|
|
Meister
Joined: 27 May 2010 Posts: 319
|
Posted: Mon Apr 28, 2014 11:46 am Post subject: |
|
|
Hi, thanks.
Quote: | - check if programming works (use verify). it could be a setting for your programmer is not right.
- if it works with C, check the registers that are set. and also, try if setting DDRA in your C code gives the same problem!
|
Programming always verifies (Studio6.2) and is ok.
This Bascom Code gives 29Hz on PA3 and PA4:
The same in C-code puts out nothing (0) as it should be.
Code: | $regfile = "attiny841.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
Disable Interrupts
Ddra = &B1111_1111 |
Strange 29Hz.
Regards, Meister |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Mon Apr 28, 2014 12:19 pm Post subject: |
|
|
the code you show here is simple :
Cli ; disable global interrupts
Ldi R23,$FF
Out $001A,R23
that can never be the problem. _________________ Mark |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Mon Apr 28, 2014 12:20 pm Post subject: |
|
|
of course you need to insert an END but i guess you did. _________________ Mark |
|
Back to top |
|
|
Meister
Joined: 27 May 2010 Posts: 319
|
Posted: Mon Apr 28, 2014 12:30 pm Post subject: |
|
|
Right, there was an "End". Just had stopped selcting above that line.
But my previous tests showed that there is no difference with End or not with End.
I agree, that assembler code won't be harmful.
So there should be happening something more...
Regards, Meister |
|
Back to top |
|
|
Meister
Joined: 27 May 2010 Posts: 319
|
Posted: Mon Apr 28, 2014 12:34 pm Post subject: |
|
|
Without the DDRA= ... the outputs are quiet.
In this Chip the outputs are muxed to several pins. Maybe the problem comes from that.
Regards, Meister
Last edited by Meister on Mon Apr 28, 2014 12:37 pm; edited 1 time in total |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Mon Apr 28, 2014 12:37 pm Post subject: |
|
|
there is not much more.
stack is set up
watchdog is disabled
ram is cleared. (try $noramclear)
that is it. _________________ Mark |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Mon Apr 28, 2014 12:40 pm Post subject: |
|
|
like i said :
;##### DDRA = &B1111_1111
Ldi R23,$FF
Out $001A,R23
I can not imagine that is wrong. But as i asked before : if you do that in C , you do not get the problem?
show the C code. and possible the asm it create for setting ddr.
beside from the register i can not imagine it can be done otherwise.
atmel inc file : .equ DDRA = 0x1A ;
so the address is right.
maybe the code also set the PORT ? _________________ Mark |
|
Back to top |
|
|
Meister
Joined: 27 May 2010 Posts: 319
|
Posted: Mon Apr 28, 2014 12:42 pm Post subject: |
|
|
The full code with $noramclear (doesn't help).
Code: | $regfile = "attiny841.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
'$baud = 57600
$noramclear
Disable Interrupts
'Puea = 0
'Porta = 0
'Tocpmcoe = &B0000_0000
Ddra = &B1111_1111
'Tccr0a = &B0101_0010
'Tccr0b = &B0000_0001
'Set Tccr0b.6
'Tcnt0 = 0
'Ocr0a = &H03
'Ocr0b = Ocr0a
'Tocpmsa0 = 0
'Tocpmsa1 = &B0000_1010
'Do
'Loop
End |
Regards, Meister |
|
Back to top |
|
|
Meister
Joined: 27 May 2010 Posts: 319
|
Posted: Mon Apr 28, 2014 1:18 pm Post subject: |
|
|
Very strange. I have a Logicanalyser connected to PA3 and PA4. Then I get the 29Hz pulses when using the Bascom Code. I do not get those pulses when using the equivalent C-Code.
Now, I disconnect the Logicanalyzer. Then (on oscilloscope) the pulses disappear -and come back when reconnecting. The LA-Input disconnected outputs 3V. So probably those are working against eachother. But a LA is legitimate to be connected, its impedance should not be low.
So the Port settings must be different between the Bascom and the C-Program.
Any further help appreciated, Meister |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Mon Apr 28, 2014 1:27 pm Post subject: |
|
|
the real strange thing is that i asked for the C code and the asm but still did not get it. how can i compare it than?
are you aware that this tiny uses the PUD for pull up? _________________ Mark |
|
Back to top |
|
|
Meister
Joined: 27 May 2010 Posts: 319
|
Posted: Mon Apr 28, 2014 1:28 pm Post subject: |
|
|
The C-program:
Code: |
#include <tiny841.h>
//#include <io.h>
void main(void)
{
DDRA=0xff ;
while (1)
{
// Please write your application code here
}
}
|
Assembler attached.
Regards, Meister |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Mon Apr 28, 2014 1:38 pm Post subject: |
|
|
that code does not do a thing.
better load it in studio and have a look there at the asm.
the text you sent is all remarked. so it is the same as doing in bascom
' DDRA=&HFF
^ notice the remark. this will give the same effect in bascom _________________ Mark |
|
Back to top |
|
|
Meister
Joined: 27 May 2010 Posts: 319
|
Posted: Mon Apr 28, 2014 2:43 pm Post subject: |
|
|
Hi Mark,
I try to summerize up to this point:
In my first post I had posted a code that produced those 29Hz chopped HF pulse trains.
That was line by line translated from C, including the PUE register.
Unlike the C-program, only the Bascom output was chopped.
However, the PUE register setting can be omitted in the C-program and everything still works.
Then I stripped down the code to just the DDRA=.. line (so, doing "nothing").
But already with that we have different results with the C and Bascom (getting 29Hz pulses when the LA is connected to the pins, with Bascom-code, not with C).
Here is the Assembler code from the C-code obtained from Studio.
Code: | --- No source file -------------------------------------------------------------
0000001E RJMP PC-0x001E Relative jump
0000001F CLI Global Interrupt Disable
00000020 CLR R30 Clear Register
00000021 OUT 0x1C,R30 Out to I/O location
00000022 OUT 0x35,R30 Out to I/O location
00000023 LDI R24,0x0D Load immediate
00000024 LDI R26,0x02 Load immediate
00000025 CLR R27 Clear Register
00000026 ST X+,R30 Store indirect and postincrement
00000027 DEC R24 Decrement
00000028 BRNE PC-0x02 Branch if not equal
00000029 LDI R24,0x00 Load immediate
0000002A LDI R25,0x02 Load immediate
0000002B LDI R26,0x00 Load immediate
0000002C LDI R27,0x01 Load immediate
0000002D ST X+,R30 Store indirect and postincrement
0000002E SBIW R24,0x01 Subtract immediate from word
0000002F BRNE PC-0x02 Branch if not equal
00000030 LDI R30,0x00 Load immediate
00000031 OUT 0x13,R30 Out to I/O location
00000032 OUT 0x14,R30 Out to I/O location
00000033 OUT 0x15,R30 Out to I/O location
00000034 SER R30 Set Register
00000035 OUT 0x3D,R30 Out to I/O location
00000036 LDI R30,0x02 Load immediate
00000037 OUT 0x3E,R30 Out to I/O location
00000038 LDI R28,0x80 Load immediate
00000039 LDI R29,0x01 Load immediate
0000003A RJMP PC+0x0001 Relative jump
--- D:\cvavreval\Attiny841\Attiny841baretest.c ---------------------------------
DDRA=0xff ;
0000003B SER R30 Set Register
--- D:\cvavreval\Attiny841\Attiny841baretest.c ---------------------------------
0000003C OUT 0x1A,R30 Out to I/O location
{
0000003D RJMP PC-0x0000 Relative jump |
Thank you for help. Regards, Meister |
|
Back to top |
|
|
|